2014-10-02 92 views
1

我想改变node.js中的DOM结构。我可以加载XML字符串并使用xmldom中的本地方法(https://github.com/jindw/xmldom)更改它,但是当我加载XPath(https://github.com/goto100/xpath)并尝试通过该选择器更改DOM时,它不起作用。如何通过node.js中的XPath在xmldom中更改DOM?

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

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

示例代码来说明如何(纯JS?)我今天正在尝试,也许我只是想念一些基本的东西?

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()); 

回答

2

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

0

由于aredridel状态,当您选择节点时,.select()将默认返回一个数组。所以你需要从该数组中获取节点。

您也可以使用.select1(),如果你只需要选择一个节点:

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