Как создать *точную* копию XML-документа с разрешенными сущностями

StackOverflow https://stackoverflow.com/questions/1641944

  •  10-07-2019
  •  | 
  •  

Вопрос

Учитывая такой 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 для разрешения сущностей.

Это было полезно?

Решение

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

<title>Stack Overflow Madness</title>

и

<title >Stack Overflow Madness</title >

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

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

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

Другие советы

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

string s = "<title>&title;</title>";
s = s.replace("&title;", "Stack Overflow Madness");
SaveXml(s);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top