我有一个xml文件,我使用xmlstreamreader对象从中读取。
所以我要简单一点:
以XML为例:
<mySample xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" attribute1="value1"/>
所以我需要的是获取值(作为字符串)“xmlns:xsi”并获取值(作为字符串)“http://www.w3.org/2001/XMLSchema-instance”
我确实尝试过这样的测试:
if (reader.getEventType() != XMLStreamConstants.NAMESPACE){
attributeName = reader.getAttributeLocalName(i);
attributeValue = reader.getAttributeValue(i);
}
else{
attributeName = reader.getNamespacePrefix(i) + reader.getNamespaceURI(i);
attributeValue = reader.getAttributeValue(i);
}
但没用。
很明显,我错过了一些新的API,所以任何帮助都是非常欢迎的。
最佳答案
JSR-173规范(StAxAPI为Java)陈述以下关于命名空间事件:
命名空间
命名空间声明也可以存在于StartElement之外,并且可以报告为
独立信息项。一般来说,名称空间是startelement的一部分
事件。当名称空间是xquery或xpath表达式的结果时,它们可能是
报告为独立事件。
因此,如果您正在查看名称空间事件,您很可能应该检查StartElement
事件,并检查它们。再次从规范中:
可以使用以下方法访问命名空间:
int getNamespaceCount();
字符串getnamespaceprefix(int index);
字符串getnamespaceuri(int index);
只有在当前StartElement上声明的命名空间可用。名单上有
不包含以前声明的命名空间,也不删除重新声明的命名空间。
在解析过程中的任何时候,都可以获取当前完整的命名空间上下文:
通过调用XMLStreamReader.getNamespaceContext()
StartElement.getNamespaceContext()
这些方法返回javax.xml.namespace.NamespaceContext
接口。
这就是理论:大多数名称空间声明来自start_元素,有些可能是独立的。
实际上,我从未在读取文件时访问过api报告的命名空间事件。它几乎总是作为start_元素的一部分报告(并在相应的end_元素中重复),因此如果您对命名空间声明感兴趣,则必须检查start_元素。例如,从文档开始:
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><mySample xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" attribute1=\"value1\"/>";
XMLStreamReader reader = XMLInputFactory.newFactory().createXMLStreamReader(new StringReader(xml));
while (reader.hasNext()) {
int event = reader.next();
if (XMLStreamConstants.START_ELEMENT == event) {
if (reader.getNamespaceCount() > 0) {
// This happens
System.out.println("ELEMENT START: " + reader.getLocalName() + " , namespace count is: " + reader.getNamespaceCount());
for (int nsIndex = 0; nsIndex < reader.getNamespaceCount(); nsIndex++) {
String nsPrefix = reader.getNamespacePrefix(nsIndex);
String nsId = reader.getNamespaceURI(nsIndex);
System.out.println("\tNamepsace prefix: " + nsPrefix + " associated with URI " + nsId);
}
}
} else if(XMLStreamConstants.NAMESPACE == event) {
// This almost never happens
System.out.println("NAMESPACE EVENT");
}
}
将产生:
元素开始:mysample,命名空间计数为:1
namepsace前缀:与urihttp://www.w3.org/2001/XMLSchema-instance关联的xsi
底线:您应该检查名称空间和start_element事件,即使大多数情况下,您将只有start_element报告名称空间声明,它不是一个或另一个,两者都是。
关于java - 如何使用XMLStreamReader读取xml中的 namespace ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25135332/