You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XMLInputFactory解析XML时&符号导致数据截断问题求助

StAX解析XML含实体时文本截断问题

问题场景

使用java.xml.stream包的XMLInputFactory解析XML,目标XML内容:

<SACL>
<Criteria>Dinner</Criteria>
<Value> Rice &amp; 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实体(如&amp;)时,会将文本拆分为多个Characters事件:

  • 第一部分:Rice
  • 第二部分:解析后的&(对应原XML的&amp;)
  • 第三部分: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:15:39