【问题标题】:Data before &(ampersand) truncated while parsing XML using SAX Parser使用 SAX Parser 解析 XML 时 &(&(&) 之前的数据被截断
【发布时间】:2014-07-23 13:01:22
【问题描述】:

我正在使用 SAX Parser 来解析 XML。在其中一个 XML 标记中,我有 abc&def 之类的数据。在解析 XML 时,我将 & 替换为 &。但是在解析时,& 之前的所有数据都会被截断。 & 以及之后的所有内容都保留在截断的数据中。所以abc&def解析后会转换为&def。有人可以告诉我为什么会发生这种情况吗???

此外,我们将非常感谢您提出解决此问题的建议。

【问题讨论】:

  • @Michael Kay 解决方案有效。修改您的字符方法以附加数据 public void characters(char[] buffer, int start, int length) { temp += new String(buffer, start, length); }

标签: xml parsing xml-parsing saxparser


【解决方案1】:

SAX 接口的定义,尤其是ContentHandler.characters() 方法,表示解析器可以随意将数据拆分成块。这是为了效率;这意味着它不必在通知应用程序之前将数据从 I/O 缓冲区中复制出来。解析器可以选择在哪里拆分数据,但解析器在实体边界处拆分文本是很常见的。您的应用程序负责重新组装它:通常您的 characters() 方法应该将数据复制到 StringBuilder,然后您应该在到达下一个开始或结束标记时处理组装的内容。

【讨论】:

  • 会不会导致数据丢失???正如我在问题中提到的那样,就我而言,存在数据丢失,其中“&”之前的所有内容都被截断,“&”以及之后的数据被保留。请建议。
  • 不,没有数据丢失。您还没有显示您的代码,但通常的问题是人们不允许对 characters() 进行多次调用。
【解决方案2】:

也许这为时已晚,但一种解决方法是将 XML 文件中的所有 & 符号替换为管道符号(或您喜欢的任何其他符号)

然后,在使用 SAX Parser 解析 xml 文件时,在 characters 函数中添加这一行:

content = content.replace("|", "&");

所以它看起来像这样:

public void characters(char[] ch, int start, int length) throws SAXException {
        content = String.copyValueOf(ch, start, length).trim();
        content = content.replace("|", "&");
}

这样您就不会丢失任何数据,并且您将拥有所需的所有 & 符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多