gpt4 book ai didi

java - 如何使用 XMLStreamReader 读取 xml 中的 namespace ?

转载 作者:数据小太阳 更新时间:2023-10-29 02:53:26 26 4
gpt4 key购买 nike

我有一个 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 规范(Stax API for Java)对 NAMESPACE 事件作了如下说明:

Namespace
Namespace declarations can also exist outside of a StartElement and may be reported as a standalone information item. In general Namespaces are reported as part of a StartElement event. When namespaces are the result of an XQuery or XPath expression they may be reported as standalone events.

因此,如果您正在查看命名空间事件,您很可能应该检查 StartElement 事件,并检查它们。再一次,来自规范:

Namespaces can be accessed using the following methods:

int getNamespaceCount();
String getNamespacePrefix(int index);
String getNamespaceURI(int index);

只有在当前 StartElement 上声明的命名空间可用。该列表确实 不包含以前声明的 namespace ,也不删除重新声明的 namespace 。

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

The namespace context of the current state is available by calling XMLStreamReader.getNamespaceContext() or StartElement.getNamespaceContext(). These methods return an instance of the javax.xml.namespace.NamespaceContext interface.

这是理论:大多数 namespace 声明来自 START_ELEMENT,有些可能独立出现。

实际上,我在读取文件时从未遇到过 API 报告的 NAMESPACE 事件。它几乎总是报告为 START_ELEMENT 的一部分(并在相应的 END_ELEMENT 中重复),因此如果您对 namespace 声明感兴趣,则必须检查 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");
}
}

将产生:

ELEMENT START: mySample , namespace count is: 1

Namepsace prefix: xsi associated with URI http://www.w3.org/2001/XMLSchema-instance

底线:您应该检查 NAMESPACE 和 START_ELEMENT 事件,即使大多数时候,您只会有 START_ELEMENT 报告命名空间声明,它不是其中之一,而是两者兼而有之。

关于java - 如何使用 XMLStreamReader 读取 xml 中的 namespace ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25135332/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com