2

私は現在、ほとんどの場合にうまく機能する JAXB アノテーションを使用しています。ただし、注釈を処理/作成する方法がわかりません。次の XML があります。

   <animals>
      <animal>
        cat
        <age>5</age>
        <color>red</color>
      </animal>
   </animals>

" " または " "catを取得せずにその XML から" " を取得する方法はありますか?5red

これが私がこれまでに持っているものです:

@XmlRootElement(name = "animals")
public class Animal {

    @XmlElement(name = "animal")
    String type;
}

しかし、これを非整列化すると、空の文字列が得られます。

どんな助けでも大歓迎です!

編集
これは、私がやろうとしていることの完全な実例です:

@XmlRootElement(name = "animals")
private static class Animals {

    @XmlElement(name = "animals")
    String animalType;
}


    // This code is in "main"
    final String animalsXml = "<animals><animal>cat<color>red</color><age>5</age></animal></animals>";

    JAXBContext context = JAXBContext.newInstance(Animals.class);
    Unmarshaller um = context.createUnmarshaller();
    ByteArrayInputStream bais = new ByteArrayInputStream(animalsXml.getBytes("UTF-8"));

    Animals animals = (Animals)um.unmarshal(bais);

    boolean animalIsCat = animals.animalType == null ? false : animals.animalType.equalsIgnoreCase("cat");
    assert animalIsCat;
    // end code in main
4

3 に答える 3

1

次のようなことを試してください:

@XmlRootElement(name = "animals")
public class Animals {

    @XmlElement(name = "animal")
    List<Animal> animals;
}

public class Animal {

    @XmlMixed
    List<Object> content;
}

これで、 のcontentフィールドにはとオブジェクトAnimalの混合が含まれます。実行時にそれらを調べて、必要なビットを抽出する必要があります。StringJAXBElement

于 2011-06-27T22:29:19.107 に答える
1

まず、xml 構造は一貫している必要があります。動物のタイプを「type」タグに入れます。

<animals>
    <animal>
        <type>cat</type>
        <age>5</age>
        <color>red</color>
    </animal>
    <animal>
        <type>dog</type>
        <age>7</age>
        <color>orange</color>
    </animal>
</animals>

次に、2 つのオプションがあります。1.あなたの例に基づいて、動物用と動物用の2つのクラスが必要です。これは、デフォルトでJAXBがすべてのタグをクラスにマップするためです。Javaでオブジェクトを「含む」ためのコレクションが必要ですが、xmlには必要ありません。違いはそこにあります。対応する注釈:

package sample;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="animals")
public class Animals
{
    @XmlElement(name="animal")
    public List<Animal> animals;

    public static class Animal
    {
        public String type;
        public String color;
        public Integer age;
    }

}

ただし、このソリューションは最も洗練されたものではありません。コンテナー クラスを途中からスキップしたい場合は、 @XmlElementWrapper アノテーションを使用できます。

package sample;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="MyDocument")
public class MyDocument
{
    public String comment;

    @XmlElementWrapper(name="animals")
    @XmlElement(name="animal")
    public List<Animal> animals;


    public static class Animal
    {
        public String type;
        public String color;
        public Integer age;
    }


}

xml は次のようになります。

<MyDocument>
    <animals>
        <animal>
            <type>cat</type>
            <age>5</age>
            <color>red</color>
        </animal>
        <animal>
            <type>dog</type>
            <age>7</age>
            <color>orange</color>
        </animal>
    </animals>
</MyDocument>
于 2011-06-27T22:33:44.957 に答える
1

JAXB を使用して StAX 入力をアンマーシャリングし、StreamFilter を利用して不要なノードを排除できます。

于 2011-06-27T23:04:51.203 に答える