2011-06-27 5 views
2

私は現在JAXBアノテーションを使用していますが、これはほとんどの場合有効です。しかし、私はアノテーションを処理/作成する方法を理解できない何かを見つけました。私は、次のXMLを持っている:ノードにも内部ノードがある場合、ノードの値をマップする方法はありますか?

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

は、私はちょうど「5」または「red」をフェッチすることなく、そのXMLのうち、「cat」を得ることができる方法はありますか?

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

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

しかし、私はこれをアンマーシャリングするとき、私はちょうど空の文字列を取得します:ここで

は、私がこれまで持っているものです。

助けていただけたら幸いです! 、のcontent分野今

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

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

public class Animal { 

    @XmlMixed 
    List<Object> content; 
} 

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

アンマーシャリングの仕方を教えてください。 – mkro

+0

mkro、私は私が使用している完全なコードを追加しました。ありがとう – Polaris878

答えて

1

はこのような何かを試してみてください:ここでEDIT

は、私が何をしようとしているの完全な実施例でありますAnimalには、StringJAXBElementのオブジェクトが混在しています。実行時にそれらを調べて、必要なビットを抽出する必要があります。すべての

+0

'@ XmlMixed'はうまくいきます、ありがとう! – Polaris878

1

まず、XML構造コヒーレントである必要があります - 「タイプ」タグの中に動物の種類を置く:

<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> 
+0

はい、私はXML構造が一貫していなければならないことに同意します、そして、このXMLが属するXML構造は私を狂わせます。しかし、私はXMLの構造を制御することができないので、私は支払う必要があります。 – Polaris878

1

あなたはStAXのを非整列化するためにJAXBを使用することができます

:不要なノードを除去するStreamFilterを入力し、活用
関連する問題