【问题标题】:Sort xml attributes for pretty print using javax.xml.transform.Transformer使用 javax.xml.transform.Transformer 对 xml 属性进行排序以获得漂亮的打印效果
【发布时间】:2012-03-01 06:24:37
【问题描述】:

有没有办法让 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

【问题讨论】:

  • 如果你能说服转换器以某种方式使用“规范形式”,属性应该按字母顺序排列。 Xerces 在其DomConfiguration 中对此提供了支持。这可能是一个开始。

标签: java xml pretty-print


【解决方案1】:

如前所述,到 42 岁时,您可以从 XML 制作规范的 XML,这将为您按字母顺序排列属性。

在 Java 中,我们可以使用 Apache 的 Canonicalizer 之类的东西

org.apache.xml.security.c14n.Canonicalizer

类似这样的东西(假设 XMLDoc 中的 Document 已经是一个 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);

当然,当规范化时其他事情会发生变化(它将成为规范 XML http://en.wikipedia.org/wiki/Canonical_XML),所以除了属性顺序之外,请期待一些变化。

【讨论】:

  • 有趣,我把它规范化了,但是其中一个定义(来自维基百科)似乎不适用,空标签没有扩展到打开/关闭格式。此外,来自 org.w3c.dom.Document 的 .normalize() 似乎做的完全一样。我错过了什么吗?
  • 对不起,我唯一方便的例子是使用 Apache 库,因为我已经使用了很多。您也可以将 Document.normalizeDocument 与 docs.oracle.com/javase/6/docs/api/org/w3c/dom/… 一起使用,两者都应符合 w3.org/TR/xml-c14n w3c 建议。不知道为什么不展开元素,可能是需要设置的开关。
  • 好的。无论如何,谢谢,我会看一下文档。干杯。
猜你喜欢
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2023-03-07
相关资源
最近更新 更多