如何使用已解析的实体生成XML文档的* exact *副本

时间:2009-10-29 06:33:28

标签: java xml xml-parsing

给出这样的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文档的精确副本。

2 个答案:

答案 0 :(得分:1)

您是否可以将xml模板作为字符串读入? 并使用字符串执行类似

的操作
string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);

答案 1 :(得分:1)

你几乎肯定不能使用我听说过的任何XML解析器来做这件事,当然Sun XML解析器也做不到。就XML的含义而言,他们会愉快地丢弃那些没有意义的细节。例如,

<title>Stack Overflow Madness</title>

<title >Stack Overflow Madness</title >

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

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

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