Javascript XPATH issues



我有一个XML对象(y),看起来像这样

<?xml version='1.0' ?> 
<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>

这是我试图用来获取<media>中的"xmlns"属性,但我无法获得它。即使我执行以下操作,我似乎也无法在<media>中获得该属性。

var z = y.evaluate("//@*",y,null,XPathResult.ANY_TYPE,null);
z.iterateNext()

我希望能够使用 z.iterateNext() 获得这样的东西:

xmlns="urn:xmpp:message:multimedia"

提前感谢!

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 中使用命名空间轴也没有找到任何内容)。

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 + '"');
}

最新更新