使用javax.xml.transform.Transformer对xml属性进行排序以实现漂亮打印。
使用javax.xml.transform.Transformer对xml属性进行排序以实现漂亮打印。
有没有办法告诉XML转换器按照字母顺序对给定XML标签的所有属性进行排序?例如...
将会变成
我在这里和这里找到了如何格式化的示例,但是对标签属性进行排序是我遇到的最后一个问题。
我希望有这样的东西:
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.SORTATT, "yes"); // <-- 没有这样的功能
这似乎是他们所说的:
http://docs.oracle.com/javase/1.4.2/docs/api/javax/xml/transform/OutputKeys.html
问题的原因是需要对XML文件的属性进行排序,以便进行美观打印。解决方法是使用javax.xml.transform.Transformer类来实现。
在Java中,可以使用Apache的Canonicalizer类来对XML进行规范化。具体实现代码如下:
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会导致其他变化,例如属性的顺序发生改变。另外,org.w3c.dom.Document类的.normalize()方法也可以实现相同的功能。
可以参考文档docs.oracle.com/javase/6/docs/api/org/w3c/dom/…了解更多信息。根据w3.org/TR/xml-c14n的W3C推荐,这两种方法都应该符合规范。
希望以上信息能帮助解决问题。