私はxml解析が初めてです。練習のために DOM を使用して xml を解析しました。ここで、一部を他の xml 解析フレームワークに移動することを考えました。そのため、JAXB パーサーを選択しました。私の要件では、すべての xml タグに対してゲッター セッターを作成できませんでした。私が取得するxmlは動的であるためです。そのため、ゲッター/セッターを作成するためのタグを事前に知りません。このリンクhttp://www.mkyong.com/java/jaxb-hello-world-example/を参照しました。ゲッターとセッターを作成せずに解析を行う方法はありますか?明確にしてください。
4 に答える
JAXBの場合、動的に取得する可能性のあるすべてのXMLタグに対して、変数と対応するゲッターおよびセッターを作成する必要があります。タグ(動的に取得する)はあるが、対応するマップされた変数がJavaクラスにない場合は、JAXB例外が発生します。
したがって、JAXB Javaクラスで定義されているが、要求で着信するタグを持つことができますが、JAXBクラスで定義されていないが、XMLで着信するタグを逆にすると、例外が発生します。
@XmlAnyElement
とのXmlAnyAttribute
注釈を利用して、余分なコンテンツをマップできます。get
/メソッドが不要な場合は、クラスset
に追加するだけです。@XmlAccessorType(XmlAccessType.FIELD)
お客様
以下のクラスでは、特定の XML 属性と要素@XmlAnyElement
をマップし、アノテーションを使用して、表示される可能性のある他の要素をマップし、表示@XmlAnyAttribute
される可能性のある他の属性をマップします。
import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
@XmlAttribute
int id;
@XmlAnyAttribute
Map<QName, String> otherAttributes;
String name;
@XmlAnyElement(lax=true)
List<Object> otherElements;
}
入力.xml
デモ コードで次の XML ドキュメントをアンマーシャリングします。
<?xml version="1.0" encoding="UTF-8"?>
<customer id="123" status="good">
<name>Jane Doe</name>
<address>
<street>1 A Street</street>
<city>Any Town</city>
</address>
<phone-number>555-1111</phone-number>
</customer>
デモ
次のドキュメントは、XML 入力をアンマーシャリングし、結果のすべてのオブジェクトのコンテンツをダンプしてSystem.out
、オブジェクトを XML にマーシャリングします。
import java.io.File;
import java.util.Map.Entry;
import javax.xml.bind.*;
import javax.xml.namespace.QName;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class, Address.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14272453/input.xml");
Customer customer = (Customer) unmarshaller.unmarshal(xml);
// Mapped XML Attribute
System.out.println("customer.id");
System.out.println(" " + customer.id);
// Other XML Attributes
System.out.println("customer.otherAttributes");
for(Entry<QName, String> entry : customer.otherAttributes.entrySet()) {
System.out.println(" " + entry);
}
// Mapped XML Element
System.out.println("customer.name");
System.out.println(" " + customer.name);
// Other XML Elements
System.out.println(customer.otherElements);
for(Object object : customer.otherElements) {
System.out.println(" " + object);
}
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}
出力
以下は、デモ コードを実行した結果の出力です。すべてのフィールドに XML ドキュメントのデータがどのように取り込まれているかに注目してください。
customer.id
123
customer.otherAttributes
status=good
customer.name
Jane Doe
customer.otherElements
forum14272453.Address@24f454e4
[phone-number: null]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="123" status="good">
<name>Jane Doe</name>
<address>
<street>1 A Street</street>
<city>Any Town</city>
</address>
<phone-number>555-1111</phone-number>
</customer>
詳細については
これは動的になります。Customer.setElements の呼び出しを非整列化します。マーシャリング呼び出し Customer.getElements
@XmlRootElement
class Customer {
@XmlAnyElement
public void setElements(List<Element> list) {
for (Element e : list) {
String name = e.getNodeName();
String value = e.getTextContent();
}
}
public List<Element> getElements() throws ParserConfigurationException {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
List<Element> list = new ArrayList<>();
Element e = doc.createElement("e1");
e.setTextContent("v1");
list.add(e);
return list;
}
}
JSONプロセッサで有名なJacksonは、 XML解析もサポートしており、ゲッターやセッターがない場合でも解析を実行できるように、優れたリフレクションを実行します。試してみる。