【问题标题】:How to parse XML with multiple character entities?如何解析具有多个字符实体的 XML?
【发布时间】:2015-06-13 01:51:29
【问题描述】:

我有一个 XML 文件,说明它使用的是 utf-8。 当我在 VIM 中打开文件时,我看到类似

<?xml version="1.0" encoding="UTF-8"?> 
<r>
  <first-tag>foo</first-tag>
  <second-tag>
     &lt;a-tag-nested-in-second-tag&gt;some data&lt;/a-tag-nested-in-second-tag&gt;
  </second-tag>
  ...
</r>

我正在使用 Java 1.6.0_41 的 SAXParser,在使用这些数据时,解析器基本上看不到格式错误的文字并跳过它们,或者似乎将格式错误的字符视为 second-tag 的“内容”数据。

这是我使用数据的方式,

File f = ...
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
stream = new FileInputStream(f);
AbstractHandler handler = ...
parser.parse(new InputSource(stream), handler);

SAX 有没有办法将嵌套的转义 XML 数据视为真正的 XML 标记,而不仅仅是 second-tag 的原样数据?

【问题讨论】:

  • 该文件要么格式错误,要么故意包含看起来像(并且可能是)XML 的数据,但对于外部文件而言不是 XML。 SAX 似乎做得完全正确。
  • 感谢 Nathan,我已经编辑了我的帖子,希望能更接近我真正想问的内容。

标签: java xml sax


【解决方案1】:

UTF-8 是一个character encoding。在单个文件中包含多个字符编码是没有意义的,您也没有显示具有多个字符编码的任何证据。

您所显示的是多个字符实体引用,例如&amp;lt; 和&amp;gt;。这些不是问题,尽管它们可能表明(有意或无意的)转义 XML 标记的输出。

是的问题是您的“XML”缺少单个根元素,因此不是well-formed。

如果你给你的标记一个单一的根元素,

<?xml version="1.0" encoding="UTF-8"?>
<r>
  <first-tag>foo</first-tag>
  <second-tag>
    &lt;a-tag-nested-in-second-tag&gt;some data&lt;/a-tag-nested-in-second-tag&gt;
  </second-tag>
</r>

一个 XML 解析器将能够很好地解析它。


按 cmets 更新和更新问题

SAX 有没有办法将嵌套的转义 xml 数据视为真正的 xml 标记,而不仅仅是“第二个标签”的数据?

不,没有一个简单的配置标志可以指示 SAX 将转义的 XML 视为常规 XML。 SAX 将正确地将转义的 XML 数据视为字符和字符实体引用。您的选择包括通过

解决上游问题
  1. 消除要保留的 XML 的转义,或
  2. 对转义的 XML 数据进行后处理以重新建立原始数据 XML。

请注意,选项 #2 本身可能涉及基于 SAX 的解析器,您设计了它的实体处理程序来重建原始 XML。

另见how to unescape XML in java。

【讨论】:

  • 谢谢@kjhughes,我忘了提到该文件确实有正确的单根元素。因此,在这种情况下,解析器正确地将“a-tag-nested-in-second-tag”解析为“second-tag”的内容数据,而不是按照预期将其视为结构的一部分。在我们的示例中,不包括初始 xml 声明和根元素,实际上应该有 3 个 xml 标签,但解析器仅将其作为 2 个标签使用,其中转义的 xml 数据作为第二个标签的内容数据。 SAX 解析它“很好”,但文件的意图丢失了,因为如果转义 xml 结构。
  • 我编辑了我的帖子,希望能更接近我真正想问的问题。你的回答很有帮助。
  • 谢谢!这很有帮助,我现在可以关闭这篇文章了。
猜你喜欢
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-22
  • 2023-03-15
  • 2019-11-14
  • 2016-12-02
相关资源
最近更新 更多