gpt4 book ai didi

java - 如何在没有任何相关信息的情况下通过 JAXB 编码对象?

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:30 26 4
gpt4 key购买 nike

我有一个对象 value,它属于某种类型,可以是 @XmlRootElement 注释的,也可以不是。我想将其编码为 XML:

String value1 = "test";
assertEquals("<foo>test</foo>", toXml("foo", value1));
// ...
@XmlRootElement
class Bar {
public String bar = "test";
}
assertEquals("<foo><bar>test</bar></foo>", toXml("foo", new Bar()));

我可以使用 JAXB 现有工具来完成它,还是应该创建一些自定义分析器?

最佳答案

您可以利用 JAXBIntrospector 执行以下操作:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBIntrospector;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;

public class Demo {


public static void main(String[] args) throws Exception {
Object value = "Hello World";
//Object value = new Bar();

JAXBContext jc = JAXBContext.newInstance(String.class, Bar.class);
JAXBIntrospector introspector = jc.createJAXBIntrospector();
Marshaller marshaller = jc.createMarshaller();
if(null == introspector.getElementName(value)) {
JAXBElement jaxbElement = new JAXBElement(new QName("ROOT"), Object.class, value);
marshaller.marshal(jaxbElement, System.out);
} else {
marshaller.marshal(value, System.out);
}
}

@XmlRootElement
public static class Bar {

}

}

使用上面的代码,当 JAXBElement 被编码时,它将使用对应于适当模式类型的 xsi:type 属性进行限定:

<ROOT 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Hello World</ROOT>

要消除限定条件,您只需将创建 JAXBElement 的行更改为:

JAXBElement jaxbElement = new JAXBElement(new QName("ROOT"), value.getClass(), value);

这将产生以下 XML:

<ROOT>Hello World</ROOT>

关于java - 如何在没有任何相关信息的情况下通过 JAXB 编码对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4146540/

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