Javascript XPATH问题

时间:2017-01-07 13:42:57

标签: javascript xml xpath

我有一个类似于

的XML对象(y)
<media>

以下是我尝试使用<media>中的“xmlns”属性,但我无法得到它。 即使我执行以下操作,我似乎也无法在var z = y.evaluate("//@*",y,null,XPathResult.ANY_TYPE,null); z.iterateNext() 中获得该属性。

xmlns="urn:xmpp:message:multimedia"

我希望能够通过z.iterateNext()得到这样的东西:

pattern

提前致谢!

1 个答案:

答案 0 :(得分:0)

XPath数据模型不将名称空间声明视为属性,因此使用XPath @*将找不到xmlns="http://example.com/foo"xmlns:pf="http://example.com/bar"之类的任何名称空间声明。在范围内有命名空间节点(https://www.w3.org/TR/xpath/#namespace-nodes),但您可以使用命名空间轴(https://www.w3.org/TR/xpath/#axes)进行选择(如果支持,我认为使用Gecko引擎的Mozilla浏览器不支持它,以及下面的代码段)在Chrome或Edge中找不到使用命名空间轴的任何内容。)

&#13;
&#13;
var xmlDoc = new DOMParser().parseFromString(`<message xmlns="jabber:client" type="groupchat">
<body>https://[something].com/*.txt</body>
<media xmlns="urn:xmpp:message:multimedia">
    <source src="https://[something].com/*.txt" type="text/plain" />
</media>
<html xmlns="http://jabber.org/protocol/xhtml-im">
    <body xmlns="http://www.w3.org/1999/xhtml">
        <a href="https://[something].com/*.txt">View Paste</a>
    </body>
</html>
<x xmlns="jabber:x:event">
    <composing />
</x>
<delay xmlns="urn:xmpp:delay" />
<x xmlns="jabber:x:delay" />
</message>`, 'application/xml');

var media = xmlDoc.getElementsByTagNameNS('*', 'media')[0];


console.log('media.namespaceURI: ' + media.namespaceURI);

var xpathResult = xmlDoc.evaluate('namespace::*', media, null, XPathResult.ANY_TYPE, null);
var ns = null;

while ((ns = xpathResult.iterateNext()) != null) {
  console.log('Found in-scope namespace "' + ns.namespaceURI + '" with prefix "' + ns.prefix + '"');
}
&#13;
&#13;
&#13;