2012-02-08 77 views
2

有没有一种方法可以告诉xml转换器按字母顺序排列给定XML标记的所有属性?因此,可以说...使用javax.xml.transform.Transformer为漂亮打印排序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

+0

如果您可以说服变压器以某种方式使用“规范形式”,则属性应按字母顺序排列。 Xerces在其[DomConfiguration](http://xerces.apache.org/xerces2-j/javadocs/api/org/w3c/dom/DOMConfiguration.html)中支持。这可能是一个开始。 – 2012-02-08 21:08:54

回答

3

如前所述,通过42,您可以从XML使规范的XML和这将按字母顺序为您排序属性。

在Java中,我们可以使用类似Apache的Canonicalizer

org.apache.xml.security.c14n.Canonicalizer

是这样的(假设文档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),所以只是期望除了属性顺序以外的其他一些变化。

+0

有趣的是,我知道它是经典的,但其中一个定义(来自维基百科)似乎并不适用,空标签没有扩展到开放/关闭格式。另外,来自org.w3c.dom.Document的'.normalize()'看起来完全一样。我错过了什么吗? – filippo 2012-02-10 09:36:39

+0

对不起,我得到的唯一例子就是使用Apache库,因为我已经使用了很多。您也可以在http://docs.oracle.com/javase/6/docs/api/org/w3c/dom/DOMConfiguration.html中使用Document.normalizeDocument,它们都应符合http://www.w3。 org/TR/xml-c14n w3c推荐。我不知道它为什么不扩展元素,它可能是需要设置的开关。 – 2012-02-14 16:43:30

+0

好的。无论如何,我会查看文档。干杯。 – filippo 2012-02-15 09:48:57