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

Java中输出文件中XML属性的控制顺序,java,xml,Java,Xml,如何控制XML属性在输出文件中列出的顺序 在默认情况下,它们似乎是按字母顺序排列的,而我发送这个XML的程序显然没有处理这个字母顺序 e、 g.我想先显示zzzz,然后在下面的代码中显示bbbbb DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc =

如何控制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);

属性的顺序在XML中被定义为无关紧要的:任何一致的XML应用程序都不应该产生依赖于属性出现顺序的结果。因此,序列化程序(生成词法XML作为输出的代码)通常无法控制顺序


现在,出于美观的原因,有时拥有该控件会很好,因为XML是为人类可读而设计的。所以有一个合理的理由想要这个功能。但事实是,据我所知,没有序列化程序提供它。

当我使用XML DOM API编写文件时,我也遇到了同样的问题。为了解决这个问题,我不得不使用
XMLStreamWriter
。属性以您使用
XMLStreamWriter

编写xml文件的顺序出现在xml文件中,xml规范化会导致一致的属性顺序,主要是允许您在部分或全部xml上检查签名,尽管还有其他潜在用途。这可能适合您的目的。

如果您不想仅为自定义属性顺序使用另一个框架,只需向属性添加顺序标识符即可

<someElement a__price="32" b__amount="3"/>
您将获得:

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


Related,如果使用JAXB和带注释的对象来表示XML,则可以使用@XmlType注释中的propOrder控制顺序。与此相关:下一次,若你们能提供至少一个小例子,而不仅仅是陈述,那个将是非常有用的。但这不仅仅是为了美观。我正在生成2个xml文件,我需要手动比较它们并直观地看到差异。答案已经过时了。现在Saxon提供了(a)Saxon:attribute order作为一种在序列化时控制属性顺序的方法,以及(b)根据规范XML规范进行序列化的选项,这使您能够比较词汇形式的文档。顺便说一句,我们发现边缘浏览器不保留属性顺序,这导致了大量W3C测试失败,直到我们修复了测试。我想警告阅读此答案并决定尝试Saxon:current free version Saxon HE:10.3的开发人员,他不允许使用或Saxon\u属性\u顺序(尽管保持顺序而不指定此属性)或Saxon\u缩进空间(默认值为3,不像java代码约定中1个制表符是4个空格)。是的,这是正确的。通常,作为W3C规范扩展提供的所有Saxon语言功能都需要Saxon PE或更高版本,这是一种商业产品。
<someElement amount="3" price="32"/>