如何计算xml元素的子元素?

时间:2017-03-29 17:20:08

标签: javascript xml count children

我知道以前曾经问过这个问题,但我有点迷失在这里。

我有一个元素,我可以从中记录typeof:

typeof msg['PID']['PID.13']  // outputs "xml"

所以关注this answer我记录了children.length,其中我希望它是一个数字:

typeof msg['PID']['PID.13'].children.length  // also outputs "xml"

children.length的类型也是xml。怎么会这样?

这是隐藏在系统(Mirth)中的Javascript,其中日志记录是一个问题(至少我还没有发现它是如何工作的)所以我很难调试它。

有人知道如何让儿童计算元素吗?欢迎所有提示!

[编辑] 正如所建议的那样,我也尝试了msg['PID']['PID.13'].children.length的输出,但这似乎是空的。

3 个答案:

答案 0 :(得分:2)

对我来说似乎很奇怪的第一件事是:typeof msg['PID']['PID.13'] // 'xml'。因此,如果您从服务器获得一些xml,您可以像这样解析它:

var parser = new DOMParser(),
    doc = parser.parser.parseFromString(xml, 'text/xml'); //xml is a xml string

typeof doc // 'object'

要计算某些元素/子元素的出现次数,可以使用xpath:

var count = doc.evaluate('count(//someelement)', doc.documentElement, null, XPathResult.NUMBER_TYPE, null).numberValue;

你甚至可以跑:

doc.querySelectorAll('someelement').length

并且评论中的那些方法也会起作用:

doc.documentElement.children.length

所以我猜你在那个对象中的xml对象不是真正的XMLDocument,这就是为什么我猜那些像msg['PID']['PID.13'].children.length»这样的属性是空的«。

<强>更新

正如在@Nick Rupley的回答中指出的那样,你可能正在处理一个E4X实例,并且在过时内容存档中记录here,它已经过时了firefox并且caniuse.com上根本没有出现。因此,如果您的代码在浏览器中运行,则需要将其更改为上述变体之一。否则,您可以在mdn。

上找到有关第一个链接资源上的用法的文档

答案 1 :(得分:0)

你有一个E4X XML(或XMLList)对象。所以这样做:

msg['PID']['PID.13'].children().length()

答案 2 :(得分:0)

所以,msg['PID']['PID.13']是xml。你可以在这里发布文字吗? 如果那个xml类似于<children><length><value>5</value></length></children>那么,也许,msg['PID']['PID.13'].children可能被js解释为好像它是msg['PID']['PID.13']['children'],它是相同的js表达式。同样,依赖于什么类型的对象,它可以返回所有无效节点的空xml节点,即: typeof msg['PID']['PID.13'].children.a.b.c.d.length 也会返回xml。