如何用多个字符实体解析 XML?

How to parse XML with multiple character entities?

我有一个 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 并且在使用这些数据时,解析器基本上看不到格式错误的文字并跳过它们或似乎处理格式错误的文字字符作为 "content" 数据 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 的数据?

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

您显示的是多个字符实体引用,例如&lt;&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 解析器将能够很好地解析它。


根据评论和问题更新

Is there a way for SAX to treat the nested escaped xml data as truly xml markup and not merely data as-is for "second-tag"?

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

解决上游问题
  1. 消除您希望保留的 XML 的转义,或者
  2. post-处理转义的XML数据以重新建立原始数据 XML.

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

另见 how to unescape XML in java