使用XMLInputFactory解析XML时&符号导致数据截断问题求助
StAX解析XML含实体时文本截断问题
问题场景
使用java.xml.stream包的XMLInputFactory解析XML,目标XML内容:
<SACL> <Criteria>Dinner</Criteria> <Value> Rice & Beverage </Value> </SACL>
解析代码片段:
if(xmlEvent.asStartElement().getName().getLocalPart().equals("Value")){ xmlEvent = xmlEventReader.nextEvent(); value = xmlEvent.asCharacters().getData().trim(); //问题出在此处 }
(xmlEventReader初始化:xmlEventReader = XMLInputFactory.newInstance().createXMLEventReader(new FileInputStream(file.getPath()));)
解析后仅得到Rice,缺失& Beverage部分,期望输出Rice & Beverage。
原因
StAX解析器处理XML实体(如&)时,会将文本拆分为多个Characters事件:
- 第一部分:
Rice - 第二部分:解析后的
&(对应原XML的&) - 第三部分:
Beverage
原代码只读取了第一个Characters事件,因此只拿到了Rice。
解决方法
循环读取所有连续的Characters事件,直到遇到结束标签,拼接所有字符内容:
if(xmlEvent.asStartElement().getName().getLocalPart().equals("Value")){ StringBuilder sb = new StringBuilder(); while (xmlEventReader.hasNext()) { xmlEvent = xmlEventReader.nextEvent(); if (xmlEvent.isCharacters()) { sb.append(xmlEvent.asCharacters().getData()); } else if (xmlEvent.isEndElement()) { // 遇到Value的结束标签时停止 break; } } value = sb.toString().trim(); }
这样就能完整获取Rice & Beverage的文本内容。
内容的提问来源于stack exchange,提问作者rishabh
相关产品推荐
相关产品推荐

