#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
как aString
и замените ocurrences ofamp;quot;
на некоторую строку «marker» - Чтобы проанализировать документ, используйте an
StringReader
для созданияInputSource
- Выполните свой метод, но создайте a
StreamResult
с помощью aStringWriter
. - Получите содержимое из
StringWriter
as aString
и замените строку маркера наamp;quot;
- Сохраните содержимое в файл
Комментарии:
1. не могу согласиться с предложенным подходом «amp; quot; тест amp; quot;», просто смотрю, как я могу игнорировать эту замену, не внося никаких изменений в исходный код pom.xml . Любые способы спасибо за подробное описание этого.