Lar*_*rry 4 java xml xslt xpath xquery
我希望能够从给定的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>
Run Code Online (Sandbox Code Playgroud)
我希望输出看起来像这样(在这种情况下以逗号分隔):
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/
Run Code Online (Sandbox Code Playgroud)
重要笔记:
重要的是我们还要考虑在特定命名空间内定义的子节点,但其定义可以在更高节点处定义.例如,我们仍然想要获取节点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())
Run Code Online (Sandbox Code Playgroud)
我会使用内置的XMLStreamReader,它是流式XML解析器实现的接口(从XMLInputFactory
类中获取).它的getName
方法返回一个QName,它可以为您提供所需的一切.
有点像:
File file = new File("samples/sample11.xml");
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
XMLStreamReader reader = inputFactory.createXMLStreamReader(new FileInputStream(file));
Set<String> namespaces = new HashSet<String>();
while (reader.hasNext()) {
int evt = reader.next();
if (evt == XMLStreamConstants.START_ELEMENT) {
QName qName = reader.getName();
if(qName != null){
if(qName.getPrefix() != null && qName.getPrefix().compareTo("")!=0)
namespaces.add(String.format("%s, %s, %s",
qName.getLocalPart(), qName.getPrefix(), qName.getNamespaceURI()));
}
}
}
for(String namespace : namespaces){
System.out.println(namespace);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5856 次 |
最近记录: |