我有一个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 + '"');
}