在使用StAX和XMLStreamReader读取XML文件时,遇到了一个奇怪的问题。不确定它是错误还是我做错了什么。还在学习StAX。
所以问题是,
XMLStreamConstants.CHARACTERS
事件中,当我将节点文本收集为XMLStreamReader.getText()
方法时。ABC & XYZ
仅返回ABC
简化的Java来源:
// Start StaX reader
XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
try {
XMLStreamReader xmlStreamReader = xmlInputFactory.createXMLStreamReader(inStream);
int event = xmlStreamReader.getEventType();
while (true) {
switch (event) {
case XMLStreamConstants.START_ELEMENT:
switch (xmlStreamReader.getLocalName()) {
case "group":
// Do something
break;
case "source":
isSource = true;
break;
case "target":
isTarget = true;
break;
default:
isSource = false;
isTrans = false;
break;
}
break;
case XMLStreamConstants.CHARACTERS:
if (srcData != null) {
String srcTrns = xmlStreamReader.getText();
if (srcTrns != null) {
if (isSource) {
// Set source text
isSource = false;
} else if (isTrans) {
// Set target text
isTrans = false;
}
}
}
break;
case XMLStreamConstants.END_ELEMENT:
if (xmlStreamReader.getLocalName().equals("group")) {
// Add to return list
}
break;
}
if (!xmlStreamReader.hasNext()) {
break;
}
event = xmlStreamReader.next();
}
} catch (XMLStreamException ex) {
LOG.log(Level.WARNING, ex.getMessage(), MessageFormat.format("{0} {1}", ex.getCause(), ex.getLocation()));
}
我不确定我到底做错了什么,或者如何收集节点的完整文本。
任何建议或提示对于继续学习StAX都会有很大帮助。 : - )
答案 0 :(得分:8)
经过努力和研究后,我已经解决了这个问题。
使用转义实体引用读取文本时出现问题。你需要设置
XMLInputFactory IS_COALESCING
至true
XMLInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
基本上这会告诉解析器用它们各自的替换文本替换内部实体引用(换句话说,就像解码一样)并将它们作为普通字符读取。