0

给定这样的 XML 文档:

 <!DOCTYPE doc SYSTEM 'http://www.blabla.com/mydoc.dtd'>
 <author>john</author>
 <doc>
   <title>&title;</title>
 </doc>  

我想解析上面的 XML 文档并生成它的所有实体都已解析的副本。所以给定上面的 XML 文档,解析器应该输出:

 <!DOCTYPE doc SYSTEM 'http://www.blabla.com/mydoc.dtd'>
 <author>john</author>
 <doc>
   <title>Stack Overflow Madness</title>
 </doc>  

我知道您可以实现org.xml.sax.EntityResolver来解析实体,但我不知道如何正确生成 XML 文档的副本,并且所有内容都完好无损(实体除外)。一切,我的意思是空格、文档顶部的 dtd、注释以及除之前应该解决的实体之外的任何其他内容。如果这是不可能的,请提出一种至少可以保留大部分内容的方法(例如,所有但没有评论)。

另请注意,我仅限于 Sun 提供的纯 Java API,因此此处不能使用第三方库。

非常感谢!

编辑:上面的 XML 文档是其原始文档的简化版本。原始问题涉及使用 EntityResolver 的非常复杂的实体解析,我在这个问题中大大降低了它的重要性。我真正感兴趣的是如何使用使用 EntityResolver 解析实体的 XML 解析器生成 XML 文档的精确副本。

4

2 回答 2

1

您是否可以将 xml 模板作为字符串读取?并用字符串做类似的事情

string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);
于 2009-10-29T06:40:22.620 回答
1

几乎可以肯定,使用我听说过的任何 XML 解析器都无法做到这一点,当然 Sun XML 解析器也无法做到。他们会很高兴地丢弃就 XML 的含义而言没有意义的细节。例如,

<title>Stack Overflow Madness</title>

<title >Stack Overflow Madness</title >

从 XML 语法的角度来看是无法区分的,Sun 解析器(正确地)将它们视为相同的。

我认为您的选择是将 XML 视为文本(正如@Wololo 建议的那样)或放宽您的要求。

顺便说一句,您可能可以独立于 XML 解析器使用 XmlEntityResolver。或者创建一个做同样事情的类。这可能意味着这String.replace...不是答案,但您应该能够实现一个临时扩展器,它迭代字符缓冲区中的字符,将它们扩展为第二个。

于 2009-10-29T06:51:36.373 回答