fom*_*mil 5 java xml dom jaxb java-ee
我有一个org.w3c.dom.Element我正在从我XmlAdapter的自定义返回@XmlElement,我想将它作为任意XML包含在JAXB对象中(我知道我必须手工制作XSD).然而,JAXB抱怨道
org.w3c.dom.Element is an interface, and JAXB can't handle interfaces.
Run Code Online (Sandbox Code Playgroud)
显然,w3c XML类型不支持Java类型,这是一种耻辱.但除此之外,当我使用javax.xml.transform.Result显然支持时,我得到相同的错误.
如何在JAXB中包含任意XML元素作为元素?
注意:根据https://forums.oracle.com/thread/1668210我也试过了
MessageFactory factory = MessageFactory.newInstance();
message = factory.createMessage();
SOAPElement element = message.getSOAPBody().addDocument(doc);
Run Code Online (Sandbox Code Playgroud)
但这也给出了同样的错误.
只要将值类型指定为(不)XmlAdapter,就可以将域对象转换为实例.org.w3c.dom.ElementObjectElement
以下是一个完整的例子.
类型的字段/属性java.lang.Object将未知内容保留为DOM节点.您可以通过在XmlAdapteras中指定值类型来在用例中利用它Object.您需要确保从marshal方法返回的根元素与@XmlElement注释定义的字段/属性匹配.
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.parsers.*;
import org.w3c.dom.*;
public class BarAdapter extends XmlAdapter<Object, Bar>{
private DocumentBuilder documentBuilder;
public BarAdapter() {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
documentBuilder = dbf.newDocumentBuilder();
} catch(Exception e) {
// TODO - Handle Exception
}
}
@Override
public Bar unmarshal(Object v) throws Exception {
Bar bar = new Bar();
Element element = (Element) v;
bar.value = element.getTextContent();
return bar;
}
@Override
public Object marshal(Bar v) throws Exception {
Document document = documentBuilder.newDocument();
Element root = document.createElement("bar");
root.setTextContent(v.value);
return root;
}
}
Run Code Online (Sandbox Code Playgroud)
富
该@XmlJavaTypeAdapter注释被用于引用XmlAdapter.
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
@XmlJavaTypeAdapter(BarAdapter.class)
private Bar bar;
}
Run Code Online (Sandbox Code Playgroud)
酒吧
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Bar {
String value;
}
Run Code Online (Sandbox Code Playgroud)
演示
由于创建DocumentBuilderFactory需要付出代价,因此我们可以通过在Marshaller上设置实例来利用JAXB处理XmlAdapter的有状态实例的能力.
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum18272059/input.xml");
Foo foo = (Foo) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setAdapter(new BarAdapter());
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(foo, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
input.xml中/输出
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<bar>Hello World</bar>
</foo>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5746 次 |
| 最近记录: |