问题描述
我使用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;
}
}
解决方法
您使用StAX解析。这意味着您从解析器中提取事件。 StAX解析没有有关您的文档的详细结构的任何信息。 请检查Differences between DOM,SAX or StAX和Java StAX parser
如果要获取XML元素的子元素,则需要自己进行跟踪。
如果您真的希望通过方便的方式访问子级,请使用DOM解析策略。但是正如您所提到的,您的文档约为90MB,要完全加载它可能真的很重。
,要跟踪要解析的元素,需要引入保存当前标签名称的变量以及带有感兴趣标签名称的变量:
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());
}