Node.js Xml2js来自属性

我究竟做错了什么? 我无法获取子属性中的标签的值。 这是我的xml:

<root> <time c="00:00:00"> <title>Title</title> <text>Some Text...</text> </time> <time c="00:00:01"> <title>Title 2</title> <text>Some text...</text> </time> </root> 

这就是我在节点上做的事情:

 xml2js = require('xml2js'); fs = require('fs'); var parser = new xml2js.Parser(); var timetag = '00:00:01'; fs.readFile( 'test.xml', function(err, data) { parser.parseString(data, function (err, result) { function sendSubs() { io.sockets.emit('subs', { subs: result.root.time[c=timetag].title }); } setInterval(sendSubs, 1000); }); }); 

我相信这是一个语法问题,但我没有看到它!,它可能获得两个孩子的值,如标题和文本?

问候

您正在使用的语法允许您浏览JSON对象的节点。 但似乎你正在试图把它看作是一个XPath谓词。 它不会工作。

使用xml2js可以在代码中使用以下代码获取time对象数组:

 result.root.time 

然后,循环比较$.c值,这是你如何达到的属性。 例如,第二个时间元素的属性是:

 result.root.time[1].$.c 

所以这就是你需要比较你的领域的数据。 当你发现它所在的time数组中的元素time ,你会得到这样的title (实际上是一个包含标题的单元素数组):

 var resultArr = []; for(var i = 0; i < result.root.time.length; i++) { if (result.root.time[i].$.c == timetag) { resultArr = result.root.time[i].title; break; } } 

然后你可以发送到你的套接字:

 io.sockets.emit('subs', { subs: resultArr[0] }); 

使用JSONPath的解决scheme

如果您不想在JavaScript中实现循环来比较属性值,则可以使用JSONPath。 它的语法不如XPath好,但它的工作原理。 你将不得不通过NPM得到它,并要求:

 var jsonpath = require('JSONPath'); 

然后你可以用这个expression式获得你想要的title

 var expression = "$.root.time[?(@.$.c == '00:00:01')].title[0]"; 

[..]是一个谓词, ? 是用expression式@.运行一个脚本@. 是访问属性(在xml2js对象中表示为$.c 。你当然可以用你的timetagvariablesreplacestring。

要运行search,请使用:

 var resultArr = jsonpath.eval(result, expression); 

这将返回一个包含你想要的文本的数组。 那么你可以把它发送到任何你想要的地方:

 io.sockets.emit('subs', { subs: resultArr[0] }); 

你可以在这里阅读更多关于JSONPath: http ://goessner.net/articles/JsonPath/

将XML转换为JSON时,xml2js将属性映射到“$”。 如果您的属性键名称与子键名称不匹配。 您可以合并具有子元素的属性。 保持你的JSON看起来干净。

xml2js.Parser({ignoreAttrs:false,mergeAttrs:true})

可能解决你的问题。