繁体   English   中英

如何使用XMLStreamReader读取xml中的名称空间?

[英]How to read namespace as it is in a xml using XMLStreamReader?

我有一个使用XMLStreamReader对象从中读取的xml文件。 因此,我将使其保持简单:

让我们以这个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规范(用于Java的Stax API)针对NAMESPACE事件规定了以下内容:

命名空间
命名空间声明也可以存在于StartElement之外,并且可以作为独立的信息项进行报告。 通常,将命名空间报告为StartElement事件的一部分 当名称空间是XQuery或XPath表达式的结果时,它们可能被报告为独立事件。

因此,如果您正在查看名称空间事件,则很可能应该检查StartElement事件并进行检查。 再次,从规范:

可以使用以下方法访问名称空间:

int getNamespaceCount();
字符串getNamespacePrefix(int index);
字符串getNamespaceURI(int index);

仅在当前StartElement上声明的名称空间可用。 该列表不包含以前声明的名称空间,也不会删除重新声明的名称空间。

在解析过程中的任何时候,您都可以获取当前完整的名称空间上下文:

通过调用XMLStreamReader.getNamespaceContext()StartElement.getNamespaceContext()可获得当前状态的名称空间上下文。 这些方法返回javax.xml.namespace.NamespaceContext接口的实例。

从理论上讲:大多数名称空间声明来自START_ELEMENT,有些可能独立出现。

实际上,从文件读取时,我从未遇到过API报告的NAMESPACE事件。 它几乎总是作为START_ELEMENT的一部分报告的(并在相应的END_ELEMENT中重复),因此,如果您对名称空间声明感兴趣,则必须检查START_ELEMENT。 例如,从您的文档开始:

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前缀:与URI http://www.w3.org/2001/XMLSchema-instance关联的xsi

底线:您应该检查NAMESPACE和START_ELEMENT事件,即使在大多数情况下,您将只具有START_ELEMENT报告名称空间声明,这不是一个或另一个,而是两者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM