Java Stax如何只获取特定子节点的值



我使用Stax获取xml文件(大小为90 MB(的nodeName和nodeValue:

<?xml version="1.0" encoding="UTF-8"?>
<name1>
<type>
<coord>67</coord>
<umc>57657</umc>
</type>
<lang>
<eng>989</eng>
<spa>123</spa>
</lang>
</name1>
<name2>
<type>
<coord>534</coord>
<umc>654654</umc>
</type>
<lang>
<eng>354</eng>
<spa>2424</spa>
</lang>
</name2>
<name3>
<type>
<coord>23432</coord>
<umc>14324</umc>
</type>
<lang>
<eng>141</eng>
<spa>142</spa>
</lang>
</name3>

我可以获取localName,但不能获取子节点。。。如果我想获得不同于'spa'的所有子节点的值,我该如何处理才能获得它?

Java:

XMLStreamReader dataXML = factory.createXMLStreamReader(new FileReader(path));
while (dataXML.hasNext())
{
int type = dataXML.next();
switch(type)
{
case XMLStreamReader.START_ELEMENT:
System.out.println(dataXML.getLocalName());
break;
case XMLStreamReader.CHARACTERS:
System.out.println(dataXML.getText());
break;
}
}

要跟踪正在解析的元素,需要引入包含当前标记名的变量以及包含感兴趣的标记名的可变变量:

String localname = null;
String tagName = "spa";
while (dataXML.hasNext()) {
int type = dataXML.next();
switch (type) {
case XMLStreamReader.SPACE:
continue;
case XMLStreamReader.START_ELEMENT:
localname = dataXML.getLocalName();
System.out.println(dataXML.getLocalName());
break;
case XMLStreamReader.CHARACTERS:
if (!tagName.equals(localname)) {
System.out.println(dataXML.getText());
}
break;
}
}

如果有几个标签需要处理,变量tagName可以替换为一个列表:

List<String> tagNames = new ArrayList<>();
tagNames.add("spa");

检查如下:

if (!tagNames.contains(localname)) {
System.out.println(dataXML.getText());
}

您使用StAX解析。这意味着您从解析器中提取事件。StAX解析没有任何关于您文档的详细结构的信息。请检查DOM、SAX或StAX与Java StAX解析器之间的差异

如果您想获得XML元素的子元素,您需要自己跟踪它。

如果您真的希望以方便的方式访问子级,请使用DOM解析策略。但正如您所提到的,您的文档大约为90MB,完全加载可能会非常沉重。

最新更新