私は2つのXmlファイルを持っています。
<A>
<B>xxx</B>
</A>
もう一つは
<A>
<B>
<C>xxx</C>
</B>
</A>
B
要素については、フィールドで を作成しましValueObject
たString
。また、要素XmlAdapter<Object, ValueObject>
のboolean
プロパティを使用して を作成しました。アンマーシャリングするときにできるので、から変換しようとすると、 から変換しようとするとわかります。B
setAdapter(BXmlAdapter.class, new BxmlAdaper(boolean))
BxmlAdaper
String
ValueObject
要素に最初の xml と2 番目のxmlB
の属性がある場合。それはうまくいきます。それらすべてを 1 つで非整列化できます
。しかし、なしで、アンマーシャルメソッドのインスタンスを取得しました。どうすればこのケースを解決できますか。xsi:type="prefix:ValueObject"
xsi:type="xs:string"
xml
ValueObject
xsi:type
org.apache.xerces.dom.ElementNSImpl
XmlAdapter
これら 2 つのファイル用に 2 つのスキーマ ファイルもあります。そのため、 file を使用して JAXB に要素の型を伝えるxml
ことができるのではないかと考えました。しかし、JAXBはスキーマファイルを使用してチェックしているようです。私は何かが恋しいですか?schema
B
これがクラスAのサンプルコードです
package example.dto;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import example.adapter.BXmlAdapter;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class A {
@XmlJavaTypeAdapter(BXmlAdapter.class)
private B b;
public B getB() {
return b;
}
public void setB(B b) {
this.b = b;
}
}
クラスB
package example.dto;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="B")
public class B {
private String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
パッケージ情報
@javax.xml.bind.annotation.XmlSchema(elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, namespace = "http://test/test", xmlns = @javax.xml.bind.annotation.XmlNs(prefix = "test", namespaceURI = "http://test/test"))
package example.dto;
jaxb.index
A
B
BXmlAdapter.java
package example.adapter;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import example.dto.B;
public class BXmlAdapter extends XmlAdapter<Object, B> {
private final boolean flg;
public BXmlAdapter() {
this.flg = false;
}
public BXmlAdapter(boolean flg) {
this.flg = flg;
}
@Override
public Object marshal(B v) throws Exception {
if (flg) {
return v.getTest();
} else {
return v;
}
}
@Override
public B unmarshal(Object v) throws Exception {
if (flg) {
B b = new B();
b.setTest((String) v);
return b;
} else {
return (B) v;
}
}
}
A1.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test:a xmlns:test="http://test/test">
<test:b xsi:type="test:B" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<test:test>xxxx</test:test>
</test:b>
</test:a>
A2.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test:a xmlns:test="http://test/test">
<test:b xsi:type="xs:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">xxxx2</test:b>
</test:a>
Xml2JavaObject.java
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import org.xml.sax.SAXException;
import example.adapter.BXmlAdapter;
import example.dto.A;
public class Xml2JavaObject {
public static void main(String[] args) throws ClassNotFoundException,
SAXException {
try {
File file = new File("D:\\jaxb\\A1.xml");
JAXBContext jaxbContext = JAXBContext.newInstance("example.dto");
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
jaxbUnmarshaller.setAdapter(BXmlAdapter.class,
new BXmlAdapter(false));
A a = (A) jaxbUnmarshaller.unmarshal(file);
System.out.println(a.getB().getTest());
} catch (JAXBException e) {
e.printStackTrace();
}
try {
File file = new File("D:\\jaxb\\A2.xml");
JAXBContext jaxbContext = JAXBContext.newInstance("example.dto");
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
jaxbUnmarshaller.setAdapter(BXmlAdapter.class,
new BXmlAdapter(true));
A a = (A) jaxbUnmarshaller.unmarshal(file);
System.out.println(a.getB().getTest());
} catch (JAXBException e) {
e.printStackTrace();
}
}
}
上記のコードは問題なく動作しますが、xml ファイルに xsi:type がない場合。それは動作しません。BXmlAdapter の unmarshal メソッドのパラメータは ElementNSImpl のインスタンスです....
そして私の質問は
ElementNSImpl インスタンスの処理方法
xml ファイルに xsi:type がない場合、JAXB は 1 つの ValueObject を使用して異なる xml ファイルを処理できますか?
xsi:type もスキーマ ファイルにあります。JAXBはスキーマファイルを使用してタイプを決定できますか? JAXBは検証にスキーマファイルを使用しているようです。
ありがとう