给定这样的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来解析实体,但我不知道的是如何正确地生成everything仍然完好无损的副本(除了实体)。所谓everything,我指的是空白空间、文档顶部的dtd、注释和任何其他东西,除了应该在前面解决的实体之外。如果这是不可能的,请建议一种至少可以保存大部分东西的方法(例如,除了没有评论外)。
还请注意,我仅限于Sun提供的纯Java,因此这里不能使用第三方库。
非常感谢!
编辑:上面的XML文档是其原始文档的简化版本。最初的解决方案涉及到使用EntityResolver的非常复杂的实体解析,我在这个问题上大大降低了它的重要性。我真正感兴趣的是如何使用使用EntityResolver解析实体的XML解析器生成XML文档的确切副本。
发布于 2009-10-29 06:51:36
您几乎肯定不能使用我听说过的任何XML解析器来完成这一任务,当然Sun XML解析器也无法做到这一点。对于XML的意义,他们会很高兴地抛弃那些没有意义的细节。例如,
<title>Stack Overflow Madness</title>和
<title >Stack Overflow Madness</title >从XML语法的角度看,它们是无法区分的,Sun解析器(正确地)将它们视为相同。
我认为您的选择是将XML替换为文本(如@Wololo建议的那样),或者放松您的需求。
顺便说一句,您可能可以独立于XML解析器使用XmlEntityResolver。或者创建一个做同样事情的类。这可能意味着String.replace...不是答案,但是您应该能够实现一个临时扩展器,它在字符缓冲区中迭代字符,将它们扩展为第二个。
发布于 2009-10-29 06:40:22
您可以将xml模板作为字符串读取吗?用绳子做一些类似的事情
string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);https://stackoverflow.com/questions/1641944
复制相似问题