1

私はxml解析が初めてです。練習のために DOM を使用して xml を解析しました。ここで、一部を他の xml 解析フレームワークに移動することを考えました。そのため、JAXB パーサーを選択しました。私の要件では、すべての xml タグに対してゲッター セッターを作成できませんでした。私が取得するxmlは動的であるためです。そのため、ゲッター/セッターを作成するためのタグを事前に知りません。このリンクhttp://www.mkyong.com/java/jaxb-hello-world-example/を参照しました。ゲッターとセッターを作成せずに解析を行う方法はありますか?明確にしてください。

4

4 に答える 4

1

JAXBの場合、動的に取得する可能性のあるすべてのXMLタグに対して、変数と対応するゲッターおよびセッターを作成する必要があります。タグ(動的に取得する)はあるが、対応するマップされた変数がJavaクラスにない場合は、JAXB例外が発生します。

したがって、JAXB Javaクラスで定義されているが、要求で着信するタグを持つことができますが、JAXBクラスで定義されていないが、XMLで着信するタグを逆にすると、例外が発生します。

于 2013-01-11T05:54:53.963 に答える
1

@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>

詳細については

于 2013-01-11T11:05:52.743 に答える
0

これは動的になります。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;
    }
}
于 2013-01-11T06:29:22.180 に答える
-1

JSONプロセッサで有名なJacksonは、 XML解析もサポートしており、ゲッターやセッターがない場合でも解析を実行できるように、優れたリフレクションを実行します。試してみる。

于 2013-01-11T05:52:48.547 に答える