Сортировка атрибутов xml для красивой печати с использованием javax.xml.transform.Transformer - PullRequest
2 голосов
/ 08 февраля 2012

Есть ли способ, как я мог бы сказать преобразователю 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

1 Ответ

4 голосов
/ 09 февраля 2012

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

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

org.apache.xml.security.c14n.Canonicalizer

Примерно так (при условии, что Document inXMLDoc уже является 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);

Другие вещи будут изменены, когда, конечно, Canonicalizing (он станет Canonical XML http://en.wikipedia.org/wiki/Canonical_XML), поэтому просто ожидайте некоторые изменения, отличные от порядка атрибутов.

...