有没有办法告诉xml转换器按字母顺序排列给定XML标签的所有属性?所以我们说......
<MyTag paramter1="lol" andTheOtherThing="potato"/>
会变成
<MyTag andTheOtherThing="potato" paramter1="lol"/>
我看到了如何从我找到here和here的示例中对其进行格式化,但是对标记属性进行排序将是我的最后一个问题。
我希望有类似的东西:
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
答案 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),所以只需要一些属性顺序以外的变化。