[英]Node.js Xml2js result from attribute
我究竟做错了什么? 我无法在子属性中获取标记的值。 这是我的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的解决方案
如果您不想在JavaScript中实现循环来比较属性值,则可以使用JSONPath。 它的语法不如XPath好,但它的工作原理。 你必须通过NPM获得它并要求:
var jsonpath = require('JSONPath');
然后你可以用这个表达式获得你想要的title
:
var expression = "$.root.time[?(@.$.c == '00:00:01')].title[0]";
[..]
是谓词, ?
是运行带有表达式@.
的脚本@.
是访问属性(在xml2js对象中表示为$.c
。当然,你可以用你的timetag
变量替换字符串。
要运行搜索,请使用:
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})
可能解决你的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.