Xml Jaxb 命名空间和属性顺序

Posted

技术标签:

【中文标题】Xml Jaxb 命名空间和属性顺序【英文标题】:Xml Jaxb namespaces and attributes order 【发布时间】:2019-05-06 04:14:20 【问题描述】:

我正在尝试使用 JaxB (Jaxb2Marshaller) 将 Java 对象解析为 Xml 表示。在一个元素中,我有两个命名空间和几个属性。一切都很好,但首先我得到了属性,然后是命名空间。 如何更改,甚至可以更改顺序,所以首先我有命名空间,然后是所有属性。

我现在得到了什么

    <Element elementId="AB000000011" timeStamp="2018-12-04T18:48:52.535+02:00" version="2.0" xmlns="http://www.namespace.com/schemas/namespaceapi" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#">

我想要达到的目标

    <Element xmlns="http://www.namespace.com/schemas/namespaceapi" xmlns:ns2="http://www.w3.org/2000/09/xmldsig#" elementId="AB000000011" timeStamp="2018-12-04T18:48:52.535+02:00" version="2.0" >

当然我可以在@XmlType#propOrder 的帮助下管理属性的顺序,但是用命名空间做类似事情的方法是什么?

【问题讨论】:

命名空间也是属性,XML属性是无序的,所以任意顺序都是有效的。为什么要关心属性顺序? XML 没有。 【参考方案1】:

我不知道如何更改订单,但您可以使用现有的文件生成一个全新的 xml 文件并选择您的订单。

    DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder();
    Document document = documentBuilder.newDocument();

    // Root Element
    Element root = document.createElement("Element");
    document.appendChild(root);

    // xmlns Element 
    Element xmlns = document.createElement("");
    root.appendChild(xmlns);

    // xmlns2 Element 
    Element xmlns2 = document.createElement("xmlns:ns2");
    root.appendChild(xmlns2);

    // Id Element 
    Element elementId = document.createElement("elementId");
    root.appendChild(elementId);

    // timeStamp Element 
    Element timeStamp = document.createElement("timeStamp");
    root.appendChild(timeStamp);

    // Version Element 
    Element version = document.createElement("version");
    root.appendChild(version);

你可以像这样使用 Xpath 或 Xstream 设置值(我不知道这是否是正确的名称):

    // Version Element 
    Element estruturas = document.createElement("version");
    root.appendChild(version);
    version.setTextContent(xpathElement(document, "/Element*[@class='version']").getTextContent());

希望我能帮到你。

【讨论】:

以上是关于Xml Jaxb 命名空间和属性顺序的主要内容,如果未能解决你的问题,请参考以下文章

JAXB:如何在解组 XML 文档期间忽略命名空间?

JAXB:为啥在生成的 xml 文档中未使用定义的命名空间前缀?

JAXB 编组:更改应声明命名空间的元素

Jaxb:在同一个包中解组具有多个命名空间的 xml

JAXB:如何在没有命名空间的情况下解组 XML

使用 jaxb 将命名空间添加到 xml 的根元素