如何用node.js中的XPath修改xmldom中的DOM?

我正在尝试改变node.js中的DOM结构。 我可以加载XMLstring,并用xmldom( https://github.com/jindw/xmldom )中的本地方法修改它,但是当我加载XPath( https://github.com/goto100/xpath )并尝试通过该select器改变DOM,它不起作用。

还有另一种方法可以做到这一点吗? 要求是:

  • 必须在浏览器和服务器端都工作(纯js?)
  • 不能使用eval或其他代码执行的东西(为了安全)

示例代码来显示我今天如何尝试,也许我只是想念一些基本的东西?

var xpath = require('xpath'), dom = require('xmldom').DOMParser; var xml = '<!DOCTYPE html><html><head><title>blah</title></head><body id="test">blubb</body></html>'; var doc = new dom().parseFromString(xml); var bodyByXpath = xpath.select('//*[@id = "test"]', doc); var bodyById = doc.getElementById('test'); var h1 = doc.createElement('h1').appendChild(doc.createTextNode('title')); // Works fine :) bodyById.appendChild(h1); // Does not work :( bodyByXpath.appendChild(h1); console.log(doc.toString()); 

bodyByXpath不是一个单一的节点。 第四个参数select ,如果为true,则会告诉它只返回第一个节点; 否则,这是一个列表。

作为aredridel状态, .select()将在select节点时默认返回一个数组。 所以你需要从这个数组中获得你的节点。

如果您只想select单个节点,也可以使用.select1()

 var bodyByXpath = xpath.select1('//*[@id = "test"]', doc);