Pergunta

Dado um documento XML como este:

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

Eu queria analisar o documento XML acima e gerar uma cópia do mesmo com todas as suas entidades já resolvido. Assim, dado o documento XML acima, o analisador deve saída:

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

Eu sei que você poderia implementar um org.xml.sax.EntityResolver para entidades resolver, mas o que eu não sei é como gerar corretamente uma cópia do documento XML com tudo ainda intacto (exceto suas entidades). Por tudo , quero dizer os espaços em branco, o DTD no topo do documento, os comentários, e quaisquer outras coisas, exceto as entidades que deveriam ter sido resolvidos anteriormente. Se isso não for possível, por favor sugerir uma forma que, pelo menos, pode preservar a maioria das coisas (por exemplo, todos, mas sem comentários).

Note também que estou restrito à API Java puro fornecido pela Sun, bibliotecas de forma que nenhum de terceiros podem ser usados ??aqui.

Muito obrigado!

EDIT: O documento XML acima é uma versão muito simplificada do seu documento original. O original envolve uma resolução entidade muito complexa usando EntityResolver cujo significado eu tenho muito reduzida nesta questão. O que eu estou realmente interessado é como produzir uma cópia exata do documento XML com um analisador XML que usa EntityResolver para resolver as entidades.

Foi útil?

Solução

Você quase certamente não pode fazer isso usando qualquer analisador XML que eu ouvi falar, e certamente os analisadores XML Sun não pode fazê-lo. Eles vão detalhes que não têm nenhum significado na medida em que o significado do XML está em causa felizmente descartar. Por exemplo,

<title>Stack Overflow Madness</title>

e

<title >Stack Overflow Madness</title >

são indistinguíveis a partir da perspectiva da sintaxe XML, e os analisadores Sun (com razão) tratá-los como idênticos.

Eu acho que suas escolhas são para fazer a substituição tratar o XML como texto (como @Wololo sugere) ou relaxar suas necessidades.

A propósito, você provavelmente pode usar um XmlEntityResolver independentemente do parser XML. Ou criar uma classe que faz a mesma coisa. Isso pode significar que String.replace... não é a resposta, mas você deve ser capaz de implementar um ad-hoc expansor que itera sobre os personagens em um buffer de caracteres, expandindo-los em um segundo.

Outras dicas

É possível para você ler no modelo XML como uma string? E com a corda fazer algo como

string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top