当前位置: 首页 > 面试题库 >

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

汪鸿波
2023-03-14
问题内容

有没有一种方法可以告诉xml转换器按字母顺序对给定XML标签的所有属性进行排序?所以说…

<MyTag paramter1="lol" andTheOtherThing="potato"/>

会变成

<MyTag andTheOtherThing="potato" paramter1="lol"/>

我希望有这样的事情:

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


问题答案:

如前所述,到42岁时,您可以从XML中创建规范XML,这将为您按字母顺序对属性进行排序。

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

org.apache.xml.security.c14n.Canonicalizer

这样的事情(假设inXMLDoc中的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);

当然,当进行规范化时,其他事情都会更改(它将变成Canonical XML
http://en.wikipedia.org/wiki/Canonical_XML),因此,除了属性顺序之外,还需要进行其他更改。



 类似资料:
  • 这是如何从命令行漂亮地打印XML?的后续问题。 libxml2中是否有任何工具允许我对齐每个节点的属性?我有一个大的XML文档,它的逻辑结构我不能改变,但是我想打开它 成

  • 问题内容: 我正在使用Java MongoDB驱动程序3.3版使用Mongo Aggregation Framework。我有一个 聚集管道 ,这只是类型的集合。我试图找到一种方法来漂亮地打印管道的每个阶段。 在每个元素上调用方法是不够的,因为每个阶段都是接口的简单实现的实例。这个愚蠢的类没有任何方法的覆盖。 使用mongo java驱动程序类的工厂方法创建管道,如下所示: Javadoc可以在这

  • 问题内容: 我想按属性排序。这是我的代码… 现在我想按属性将其排序,例如在另一个活动中。但是我不知道该怎么做。有人知道吗? 问题答案: 您需要实现,例如: 然后像这样排序:

  • 问题内容: 如果我有一个JavaScript对象,例如: 有没有一种方法可以基于值对属性进行排序?这样我最终 问题答案: 将它们移动到一个数组,对该数组进行排序,然后将其用于您的目的。这是一个解决方案: 拥有数组后,您可以按自己喜欢的顺序从数组中重建对象,从而完全实现了您打算要做的事情。在我所知道的所有浏览器中都可以使用,但这取决于实现的怪癖,并且可能随时中断。您永远不应假设JavaScript对

  • 问题内容: 我正在从SQL Server查询生成XML文件。 我对元素排序有一些疑问。 例如,有下面的简单代码。 如您所见,树和树顺序是不同的元素,我想按属性排序 像这样。 任何人都有解决这个问题的好主意吗? 谢谢你。 对不起,我有以下详细问题 AS是 成为 : 谢谢你。 问题答案: 如果要重新排序现有的xml,可以使用: 结果: 更新: 要对多个节点重新排序,可以使用XQuery,如下所示: 更

  • 问题内容: 这是我的清单: 我想按列表排序,如果等于则按,如果等于则按。但是到目前为止,我只能使用Lambda表达式按一个属性排序: 如果我尝试 原来是错误的… 问题答案: 将lambda 表达式 更改为lambda {block} ,而不必指定参数类型: