5

ここでは、このトピックに関連するほとんどすべての質問に答えました。しかし、適切な解決策を得ることができませんでした。

私の問題は次のとおりです。

xsdを持っているxmlファイルをアンマーシャリングする簡単なプログラムを作成しました。私はそれをうまくやることができました。しかし、xsdなしでxmlを取得している場合、xmlが次のようになっている場合、そこから属性を取得するにはどうすればよいですか?

<items>
  <item>
    <code>12000</code>
    <name>Samsung  620</name>
    <price>9999</price>
  </item>
  <item>
    <code>15000</code>
    <name>NOKIA</name>
    <price>19999</price>
  </item>
  <item>
    <code>18000</code>
    <name>HTC 620</name>
    <price>29999</price>
  </item>
</items> 

ここでは、クラスを生成するためのxsdがありません。どうすれば続行できますか?親切に私を助けてください。

ありがとうございました

4

2 に答える 2

5

以下は、ユース ケースをJAXB (JSR-222)実装にマップする 1 つの方法です。

アイテム

ルート オブジェクトに次のクラスを使用し、 で注釈を付けます@XmlRootElement。注釈は、非@XmlRootElement整列化されるドキュメントのルート要素が である場合、このクラスをインスタンス化する必要があることを JAXB に伝えます。items別の名前を指定することもできます@XmlRootElement(name="foo")

package forum11152046;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Items {

    private List<Item> items;

    @XmlElement(name="item")
    public List<Item> getItems() {
        return items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

}

アイテム

この例では、すべてのプロパティ名が XML ドキュメント内の名前に直接対応するクラスを作成しました。これは、追加する必要がある注釈がないことを意味します。デフォルト名をオーバーライドする必要がある場合は、そのようなアノテーションを使用できます@XmlElement。プロパティのクラスで@XmlElementこれを行うために注釈を使用しました。Itemsitems

package forum11152046;

public class Item {

    private int code;
    private String name;
    private int price;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}

デモ

package forum11152046;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Items.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11152046/input.xml");
        Items items = (Items) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(items, System.out);
    }

}

input.xml/出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
    <item>
        <code>12000</code>
        <name>Samsung  620</name>
        <price>9999</price>
    </item>
    <item>
        <code>15000</code>
        <name>NOKIA</name>
        <price>19999</price>
    </item>
    <item>
        <code>18000</code>
        <name>HTC 620</name>
        <price>29999</price>
    </item>
</items>
于 2012-06-22T09:21:19.637 に答える
2

JAXB に固執したい場合は、独自に XML スキーマ ドキュメントを作成してそのような XML を検証することができます (単純に見えますが、単なるインスタンスです。事前にこれらのドキュメントで何が変更されるかを調べる必要があります)。これらのノードに一致するJAXBアノテーションを使用します。他に方法がないのではないかと心配しています。フォーマットが何を許可するかをよく知っておく必要があります。

于 2012-06-22T07:49:57.193 に答える