使用javax.xml.transform.Transformer为漂亮打印排序xml属性

时间:2012-02-08 19:02:09

标签: java xml pretty-print

有没有办法告诉xml转换器按字母顺序排列给定XML标签的所有属性?所以我们说......

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

会变成

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

我看到了如何从我找到herehere的示例中对其进行格式化,但是对标记属性进行排序将是我的最后一个问题。

我希望有类似的东西:

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 个答案:

答案 0 :(得分:4)

如上所述,到了42,您可以从XML中制作规范XML,并按字母顺序为您排序。

在Java中,我们可以使用类似Apache的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);

当规范化时,其他事情会发生变化(它将成为Canonical XML http://en.wikipedia.org/wiki/Canonical_XML),所以只需要一些属性顺序以外的变化。