【发布时间】:2015-08-04 17:13:24
【问题描述】:
我正在使用 XMLStreamReader 并解析以下 XML:
<root>
<element>
<attribute>level0</attribute>
<element>
<attribute>level1</attribute>
<element>
<attribute>level2</attribute>
</element>
</element>
</element>
</root>
我正在构建我的 XMLStreamReader:
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(
new ByteArrayInputStream(document.getBytes()));
不幸的是,当我到达带有reader.next(); 的第一个结束元素标记时,我得到了以下异常:
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[7,14]
Message: XML document structures must start and end within the same entity.
有没有办法覆盖 XMLStreamReader 的默认行为来解决这个问题?
编辑
这是我正在使用的代码:
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context)
throws IOException, InterruptedException {
String document = value.toString();
System.out.println("'" + document + "'");
try {
XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(
new ByteArrayInputStream(document.getBytes()));
String propertyName = "";
String propertyValue = "";
String currentElement = "";
while (reader.hasNext()) {
int code = reader.next();
switch (code) {
case START_ELEMENT:
currentElement = reader.getLocalName();
break;
case CHARACTERS:
if (currentElement.equalsIgnoreCase("element")) {
propertyName += reader.getText();
} else if (currentElement.equalsIgnoreCase("attribute")) {
propertyValue += reader.getText();
}
break;
}
}
reader.close();
context.write(new Text(propertyName.trim()), new Text(propertyValue.trim()));
} catch (Exception e) {
e.printStackTrace();
}
}
【问题讨论】:
-
您的 XML 可能格式不正确,我猜真正的 XML 文档不是您在帖子中放的,因为看起来还可以。
-
@biziclop 我已经用那个确切的 XML 进行了测试。它给出的错误是有效的......读者抛出它是因为它到达了第三个元素的结束标签并认为我正在尝试关闭第一个元素。我想知道的是,有没有办法解决这个问题?
-
它绝对不会那样做。您的 XML 或您的代码(您的问题中没有包含)有问题。
-
@biziclop 查看代码编辑。感谢您的意见。
标签: java xml xmlstreamreader