在Java中输出文件中XML属性的控制顺序

时间:2011-11-10 23:01:03

标签: java xml

如何控制输出文件中列出XML属性的顺序?

默认情况下,它们似乎正在按字母顺序排列,我发送此XML的程序显然没有处理。

e.g。我希望首先显示zzzz,然后在以下代码中显示bbbbb

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element root = doc.createElement("requests");
doc.appendChild(root);
root.appendChild(request);
root.setAttribute("zzzzzz", "My z value");
root.setAttribute("bbbbbbb", "My b value");

TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File(file));
transformer.transform(source, result);

4 个答案:

答案 0 :(得分:3)

在XML中,属性的顺序被定义为无关紧要:没有符合要求的XML应用程序应该产生依赖于属性出现顺序的结果。因此,序列化程序(产生词汇XML作为输出的代码)通常无法控制订单。

现在,出于美观的原因,有时控制该控件会很好,因为XML设计为人类可读的。因此,想要该功能的正当理由。但事实是,我知道没有提供它的序列化器。

答案 1 :(得分:2)

当我使用XML DOM API编写文件时,我遇到了同样的问题。要解决此问题,我必须使用XMLStreamWriter。属性按照您使用XMLStreamWriter编写的顺序显示在xml文件中。

答案 2 :(得分:1)

XML规范化导致一致的属性排序,主要是为了允许人们检查某些或所有XML的签名,尽管还有其他潜在的用途。这可能适合您的目的。

答案 3 :(得分:0)

如果您不想仅将另一个框架用于自定义属性订单,则只需在属性中添加订单标识符即可。

<someElement a__price="32" b__amount="3"/>

在完成XML序列化程序后,对原始XML进行后期处理,如下所示:

public static String removeAttributeOrderIdentifiers(String xml) {
    return xml.replaceAll(
        " [a-z]__(.+?=\")", 
        "$1"
    );
}

您将获得:

<someElement amount="3" price="32"/>