我希望能够从给定的 XML 文件中获取所有名称空间信息。
例如,如果输入 XML 文件类似于:
<ns1:create xmlns:ns1="http://predic8.com/wsdl/material/ArticleService/1/">
<ns1:article xmlns:ns1="xmlns:ns1='http://predic8.com/material/1/">
<ns1:id>1</ns1:id>
<description>bar</description>
<name>foo</name>
<ns1:price>
<amount>00.00</amount>
<currency>USD</currency>
</ns1:price>
<ns1:price>
<amount>11.11</amount>
<currency>AUD</currency>
</ns1:price>
</ns1:article>
<ns1:article xmlns:ns1="xmlns:ns1='http://predic8.com/material/1/">
<ns1:id>2</ns1:id>
<description>some name</description>
<name>some description</name>
<ns1:price>
<amount>00.01</amount>
<currency>USD</currency>
</ns1:price>
</ns1:article>
</ns1:create>
我希望输出看起来像这样(在本例中以逗号分隔):
create, ns1, http://predic8.com/wsdl/material/ArticleService/1/
article, ns1, http://predic8.com/material/1/
price, ns1, http://predic8.com/material/1/
id, ns1, http://predic8.com/material/1/
重要笔记:
重要的是,我们还考虑在特定命名空间内定义的子节点,但其定义可能在更高的节点上定义。例如,我们仍然想选取节点ns1:id
,我们需要追溯到父节点ns1:article
发现命名空间 url 是xmlns:ns1='http://predic8.com/material/1/
我用 Java 实现,所以我不介意基于 Java 的解决方案,甚至基于 XSLT 的解决方案似乎也合适。
这可以通过单个 XPath 2.0 表达式来完成:
distinct-values(//*[name()!=local-name()]/
concat(local-name(), ', ', substring-before(name(), ':'), ', ', namespace-uri())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)