gpt4 book ai didi

java - 重新排序 XML 标签

转载 作者:数据小太阳 更新时间:2023-10-29 02:31:29 26 4
gpt4 key购买 nike

我正在尝试实现一些将 java 对象的内容树写回 XML 文件(对象编码)的东西(我知道有很多 API 可以做到这一点,但我需要它),我想让用户根据他/她的需要重新排序标签,我知道使用像 JAXB 那样的注释可能会解决这个问题,但我认为使用注释可能会带来很多痛苦。如果有人能提供任何好的方法,那将非常有帮助。

谢谢

最佳答案

注意:我是 EclipseLink JAXB (MOXy) 领导和 JAXB (JSR-222) 的成员专家组。

another answer我描述了用于指定元素顺序的标准 JAXB 机制。在这个答案中,我将解释如何使用 MOXy 的外部映射文档来解决这部分问题:

I want to let the user to reorder the tags as he/she wants, I know using annotation like what JAXB has may solve that, but I think using annotation may cause a lot of pain.

Root 类中,我使用了 @XmlType 注释来指定顺序。

package forum11217734;

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlType(propOrder={"c", "b", "a"})
public class Root {

private String a;
private String b;
private String c;

public String getA() {
return a;
}

public void setA(String a) {
this.a = a;
}

public String getB() {
return b;
}

public void setB(String b) {
this.b = b;
}

public String getC() {
return c;
}

public void setC(String c) {
this.c = c;
}

}

jaxb.properties

要将 MOXy 指定为您的 JAXB 提供程序,您需要在与域模型相同的包中添加一个名为 jaxb.properties 的文件,其中包含以下条目(请参阅 Specifying EclipseLink MOXy as Your JAXB Provider):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

binding-acb.xml

MOXy 有一个外部映射文档扩展,允许您覆盖域模型上的映射(参见 Extending JAXB - Representing Metadata as XML )。我们将使用此文档来指定另一个顺序。

<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum11217734">
<java-types>
<java-type name="Root">
<xml-type prop-order="a c b"/>
</java-type>
</java-types>
</xml-bindings>

binding-cab.xml

我们可以使用额外的映射文档来提供替代顺序。

<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="forum11217734">
<java-types>
<java-type name="Root">
<xml-type prop-order="c a b"/>
</java-type>
</java-types>
</xml-bindings>

演示

以下演示代码演示了如何在创建 JAXBContext 时利用外部映射文档。我们将以三种不同的方式编码 Root 的同一实例。

package forum11217734;

import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class Demo {

public static void main(String[] args) throws Exception {
Root root = new Root();
root.setA("Foo");
root.setB("Bar");
root.setC("Baz");

// CBA
JAXBContext cbaContext = JAXBContext.newInstance(Root.class);
Marshaller cbaMarshaller = cbaContext.createMarshaller();
cbaMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
cbaMarshaller.marshal(root, System.out);

// ACB
Map<String, Object> acbProperties = new HashMap<String, Object>(1);
acbProperties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum11217734/binding-acb.xml");
JAXBContext acbContext = JAXBContext.newInstance(new Class[] {Root.class}, acbProperties);
Marshaller acbMarshaller = acbContext.createMarshaller();
acbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
acbMarshaller.marshal(root, System.out);

// CAB
Map<String, Object> cabProperties = new HashMap<String, Object>(1);
cabProperties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum11217734/binding-cab.xml");
JAXBContext cabContext = JAXBContext.newInstance(new Class[] {Root.class}, cabProperties);
Marshaller cabMarshaller = cabContext.createMarshaller();
cabMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
cabMarshaller.marshal(root, System.out);
}

}

输出

下面是运行演示代码的输出:

<?xml version="1.0" encoding="UTF-8"?>
<root>
<c>Baz</c>
<b>Bar</b>
<a>Foo</a>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>Foo</a>
<c>Baz</c>
<b>Bar</b>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<c>Baz</c>
<a>Foo</a>
<b>Bar</b>
</root>

关于java - 重新排序 XML 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11217734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com