Java: канонизация XML

Какой самый простой способ создать каноническую форму XML-файла в Java? У вас есть готовый код для этого? Я нашел несколько ссылок в сети, например это, это и это, но я не могу заставить его работать :/

Спасибо,

Иван

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

<Metric xmlns="http://www.ibm.com/wsla" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="total_memory_consumption_metric" type="double" unit="Mbit" xsi:schemaLocation="http://www.ibm.com/wsla WSLA.xsd">                        <Source>ServiceProvider</Source>                        <MeasurementDirective resultType="double" xsi:type="StatusRequest">                              <RequestURI> ***unused*** </RequestURI>                        </MeasurementDirective>                  </Metric>

person Ivan    schedule 25.02.2011    source источник
comment
Та же проблема, ты уже решил ее?   -  person Kwoinkwoin    schedule 28.02.2018


Ответы (2)


Класс Canonicalizer в Проект Apache XML Security.

Инициализируйте библиотеку.

org.apache.xml.security.Init.init(); 

Преобразуйте свой XML.

Canonicalizer canon = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS);
byte canonXmlBytes[] = canon.canonicalize(yourXmlBytes);
String canonXmlString = new String(canonXmlBytes);
person eolith    schedule 25.02.2011
comment
Всем, кто раньше не работал с библиотекой Apache XML Security, необходимо инициализировать библиотеку с помощью статического метода org.apache.xml.security.Init.init(); перед вызовом любого кода из этой библиотеки, иначе вы получите сообщение об ошибке. - person Stew; 16.11.2012
comment
То, что делает @Stew, очень важно. Это действительно должно быть частью самого ответа. - person aroth; 11.04.2016
comment
Я считаю, что это решение не работает с символом смайликов, который становится ?? после канонизации. - person Solomon Tam; 22.08.2018
comment
@Stew Я добавил инициализацию вашей библиотеки к исходному ответу. Лучше поздно, чем никогда :) - person eolith; 12.02.2020

Другой вариант — nu.xom.canonical.Canonicalizer, если вы при использовании XOM или если у вас нет необходимости в Apache XML Security.

person David Moles    schedule 04.11.2015
comment
Это лучший вариант. В моем случае я сначала вызвал Serializer, а затем направил результат в Canonicalizer. В результате получился более читаемый канонический XML. - person Georgios F.; 20.04.2020