Сортировка атрибутов xml для красивой печати с помощью javax.xml.transform.Transformer

Есть ли способ указать преобразователю xml отсортировать в алфавитном порядке все атрибуты тегов данного XML? Так что скажем ...

<MyTag paramter1="lol" andTheOtherThing="potato"/>

Превратится в

<MyTag andTheOtherThing="potato" paramter1="lol"/>

Я видел, как его форматировать, из примеров, которые я нашел здесь и здесь, но сортировка атрибуты тегов были бы последней проблемой, которая у меня возникла.

Я надеялся, что будет что-то вроде:

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.SORTATT, "yes"); // <-- no such thing

Кажется, это именно то, что они говорят: http://docs.oracle.com/javase/1.4.2/docs/api/javax/xml/transform/OutputKeys.html


person filippo    schedule 08.02.2012    source источник
comment
если вы можете убедить преобразователь каким-то образом использовать каноническую форму, атрибуты должны быть отсортированы в алфавитном порядке. Xerces поддерживает это в своем DomConfiguration . Это могло быть началом.   -  person forty-two    schedule 09.02.2012


Ответы (1)


Как уже упоминалось, к сорока двум годам вы можете создать канонический XML из XML, и это упорядочит атрибуты для вас в алфавитном порядке.

В Java мы можем использовать что-то вроде Canonicalizer от Apache

org.apache.xml.security.c14n.Canonicalizer

Что-то вроде этого (при условии, что документ в XMLDoc уже является DOM):

Document retDoc;
byte[] c14nOutputbytes;
DocumentBuilderFactory factory;
DocumentBuilder parser;

// CANONICALIZE THE ORIGINAL DOM
c14nOutputbytes = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS).canonicalizeSubtree(inXMLDoc.getDocumentElement());

// PARSE THE CANONICALIZED BYTES (IF YOU WANT ANOTHER DOM) OR JUST USE THE BYTES
factory = DocumentBuilderFactory.newInstance();
factory.set ... // SETUP THE FACTORY
parser = factory.newDocumentBuilder();
// REPARSE TO GET ANOTHER DOM WITH THE ATTRIBUTES IN ALPHA ORDER
ByteArrayInputStream bais = new ByteArrayInputStream(c14nOutputbytes);
retDoc = parser.parse(bais);

При канонизации, конечно, изменится и другое (он станет каноническим XML http://en.wikipedia.org/wiki/Canonical_XML), так что ожидайте некоторых изменений, кроме порядка атрибутов.

person Jayson Lorenzen    schedule 08.02.2012
comment
Забавно, я канонизировал его, но одно из определений (из Википедии), похоже, не применялось, пустые теги не были расширены до формата открытия / закрытия. Кроме того, .normalize() из org.w3c.dom.Document, похоже, делал то же самое. Я что-то упускаю? - person filippo; 10.02.2012
comment
извините, единственный пример, который у меня был под рукой, - это использование библиотек Apache, поскольку я использовал их много раз. Вы можете использовать Document.normalizeDocument с docs.oracle .com / javase / 6 / docs / api / org / w3c / dom / также должны соответствовать w3.org/TR/xml-c14n Рекомендация w3c. Я не знаю, почему это не расширяющиеся элементы, возможно, это переключатель, который нужно установить. - person Jayson Lorenzen; 14.02.2012
comment
Хорошо. В любом случае спасибо, я посмотрю в документации. ваше здоровье. - person filippo; 15.02.2012