Как создать * точную * копию XML-документа с разрешенными объектами - PullRequest
0 голосов
/ 29 октября 2009

С учетом 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 в верхней части документа, комментарии и любые другие вещи, кроме сущностей, которые должны были быть разрешены ранее. Если это невозможно, пожалуйста, предложите способ, который по крайней мере может сохранить большинство вещей (например, все, но без комментариев).

Также обратите внимание, что я ограничен чистым Java API, предоставляемым Sun, поэтому здесь нельзя использовать сторонние библиотеки.

Большое спасибо!

РЕДАКТИРОВАТЬ: Приведенный выше XML-документ является значительно упрощенной версией исходного документа. Оригинальный включает в себя очень сложное разрешение сущностей с использованием EntityResolver, значение которого я значительно уменьшил в этом вопросе. Что меня действительно интересует, так это как получить точную копию документа XML с помощью синтаксического анализатора XML, который использует EntityResolver для разрешения сущностей.

Ответы [ 2 ]

1 голос
/ 29 октября 2009

Вы почти наверняка не сможете сделать это с помощью любого парсера XML, о котором я слышал, и, конечно, парсеры Sun XML не смогут это сделать. Они с радостью отбросят детали, которые не имеют никакого значения для смысла XML. Например,

<title>Stack Overflow Madness</title>

и

<title >Stack Overflow Madness</title >

неотличимы с точки зрения синтаксиса XML, и анализаторы Sun (по праву) рассматривают их как идентичные.

Я думаю, что вы должны сделать замену, рассматривая XML как текст (как предлагает @Wololo) или ослабить ваши требования.

Кстати, вы, вероятно, можете использовать XmlEntityResolver независимо от анализатора XML. Или создайте класс, который делает то же самое. Это может означать, что String.replace... не является ответом, но вы должны иметь возможность реализовать специальный экспандер, который перебирает символы в буфере символов, расширяя их во второй.

1 голос
/ 29 октября 2009

Возможно ли прочитать в шаблоне xml строку? И со строкой сделать что-то вроде

string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...