» автоматически преобразуется в » через Document

#java #dom #java-8 #xml-parsing #domdocument

#java #dom #java-8 #xml-синтаксический анализ #domdocument

Вопрос:

Я загружаю XML-файл (pom.xml ) через org.w3c.dom.Document и редактирование значения некоторого узла (в основном изменение значения версии некоторой зависимости) через javax.xml.transform.Transformer , javax.xml.transform.TransformerFactory amp; javax.xml.transform.dom.DOMSource .

Но проблема в том, что это также преобразует все вхождения amp;quot; в символ «, чего я не хочу. Смотрите пример ниже:

 <Export-Package>!${bundle.namespace}.internal.*,${bundle.namespace}.*;version=amp;quot;${project.version}amp;quot;</Export-Package>
 

преобразовано в:

 <Export-Package>!${bundle.namespace}.internal.*,${bundle.namespace}.*;version="${project.version}"</Export-Package>
 

Пожалуйста, помогите в этом, как я могу игнорировать это автоматическое преобразование с помощью используемого в данный момент API.

Пример кода:

 public void writeDocument(File filePath)
{
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    this.thisDoc.getDocumentElement().normalize();
    Transformer transformer;
    try
    {
        transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(thisDoc);
        StreamResult result = new StreamResult(filePath);
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.transform(source, result);
    }
    catch (TransformerException e)
    {
        VersionUpdateExceptions.throwException(e, LOG);
    }
}
 

Комментарии:

1. Почему это является проблемой?

2. Мы работаем над некоторой утилитой для обновления версии и не хотим никаких несвязанных изменений, кроме обновления версии.

3. Но это произойдет только один раз; после этого преобразования все последующие обновления будут вносить предполагаемые минимальные изменения.

4. не могли бы вы опубликовать код, который выполняет обновление?

5. Добавлен пример кода.

Ответ №1:

Это требуемое поведение в соответствии со спецификацией загрузки и сохранения 3-го уровня объектной модели документа (DOM):

В символьных данных документа (вне разметки) любые символы, которые не могут быть представлены напрямую, заменяются ссылками на символы. Вхождения ‘<‘ и ‘amp;’ заменяются предопределенными объектами < и amp;. Другие предопределенные объекты (>, ‘ и «) могут не использоваться, за исключением случаев, когда это необходимо (например, использование> в таких случаях, как ‘]]>’).

Например, если вы используете amp;quot; внутри атрибута:

 <Export-Package id="amp;quot;testamp;quot;">
 

amp;quot; будет сохранено. В противном случае этого не произойдет.

При крайней необходимости вы могли бы добиться сохранения «»» с помощью уродливого взлома.

  • Прочитайте pom.xml как a String и замените ocurrences of amp;quot; на некоторую строку «marker»
  • Чтобы проанализировать документ, используйте an StringReader для создания InputSource
  • Выполните свой метод, но создайте a StreamResult с помощью a StringWriter .
  • Получите содержимое из StringWriter as a String и замените строку маркера на amp;quot;
  • Сохраните содержимое в файл

Комментарии:

1. не могу согласиться с предложенным подходом «amp; quot; тест amp; quot;», просто смотрю, как я могу игнорировать эту замену, не внося никаких изменений в исходный код pom.xml . Любые способы спасибо за подробное описание этого.