【问题标题】:How to generate an *exact* copy of an XML document with resolved entities如何生成具有已解析实体的 XML 文档的*精确*副本
【发布时间】:2009-10-29 06:33:28
【问题描述】:

给定一个这样的 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、cmets 以及除之前应该解决的实体之外的任何其他内容。如果这不可能,请提出一种至少可以保留大部分内容的方法(例如,除了没有 cmets 之外的所有内容)。

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

非常感谢!

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

【问题讨论】:

  • 精确是什么意思?逐个字符相同?或者,如果 XML 表示相同的意思,是否允许细微的变化? (请参阅我的答案以获取示例。)
  • 只要 XML 表示相同的意思,微小的变化应该是可以的。但是,如果解析器可以保留 dtd 以及断线和缩进以保留旧布局,那就太好了。

标签: java xml xml-parsing


【解决方案1】:

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

<title>Stack Overflow Madness</title>

<title >Stack Overflow Madness</title >

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

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

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

【讨论】:

  • 对此大加 1。也许如果您 (OP) 要解释为什么您需要保留确切的 XML,那么有人可以提出更好的方法。
  • 真的没有理由。如果可能的话会更好,而且我不知道 Java XML 解析器是否可能,所以我问了。
【解决方案2】:

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

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

【讨论】:

  • 不幸的是,我不能。实体解析比简单地替换 &title; 复杂得多。用别的东西。所以我将不得不使用 org.xml.sax.EntityResolver 来完成它。
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多