使用javax.xml.transform.Transformer对xml属性进行排序以实现漂亮打印。

8 浏览
0 Comments

使用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

0
0 Comments

问题的原因是需要对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推荐,这两种方法都应该符合规范。

希望以上信息能帮助解决问题。

0