2011-01-19 19 views
2

私はXML文書を持っており、その中に要素<elementName>があり、WSDLファイルに階層が設定されています。生成されたクラス(WSDLファイルから)はすべてを正しくマップします(CXFはそれを行います)。しかし、すべての名前で<elementName>を受け入れる必要がある場合はどうすればよいですか?どのように名前を受け入れ、正しい階層を持つことができますか?説明しようとしていることを理解していただければ幸いです。任意の名前をXML要素として受け入れる - JAXB、CXF

私は@XmlElement(name="")@XmlElement(name="*")を使ってみましたが、うまくいかなかったのです。

UPDATE:

@XmlAnyElement 
protected Container c; 

そして、私はそれでXMLの同じレベルのすべての要素をマッピングしたいです。

私は同じクラス(上記のようにContainer.class)にマップするためにこれら二つの例たい。具体的に:あなたはここで情報を見る@XmlAnyElement使用する必要があります

... XML hierarchy ... 
    <element> 
     ... XML content ... 
    </element> 

または

... XML hierarchy ... 
    <elementWithUglyNameaodsafh> 
     ... same XML content as above... 
    </elementWithUglyNameaodsafh> 
+0

jaxbがコンテンツがコンテナと一致することを識別したい場合、またはすべての* uglyElement *がコンテナになるようにしたい場合は、 – ekeren

+1

私のアップデートをご覧ください。これは適切な解決策ですか? – ekeren

答えて

2

を:

:例えば
http://jaxb.java.net/tutorial/section_6_2_7_6-Collecting-Unspecified-Elements-XmlAnyElement.html#Collecting%20Unspecified%20Elements:%20XmlAnyElement

私はこの問題を回避するソリューションを提供することができます問題の更新に応じて

for(Element el: doc.getZoo().getAnimals()){ 
    System.out.println(el.getNodeName() + "->" + 
         el.getTextContent()); 
} 

EDIT

public class ZooType { 
    protected List<Element> animals; 
    public ZooType(){ 
    } 

    @XmlAnyElement 
    public List<Element> getAnimals(){ 
     if(animals == null) animals = new ArrayList<Element>(); 
     return animals; 
    } 
    public void setAnimals(List value){ 
     animals = value; 
    } 
} 

後で要素の名前と値を抽出することができます。

申し訳ありませんが、私はXMLをプログラミングしたことがないので、おそらく要素の折り返しと置き換えを行うより良い方法があります。

一番下の行は次のとおりです。オフコース

@XmlRootElement 
public class Root { 

public Container c; 

@XmlAnyElement 
public void setElements(Element e) throws JAXBException, ParserConfigurationException { 
    Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 
    Element container = d.createElement("container"); 
    d.appendChild(container); 
    Node node = d.adoptNode(e.getFirstChild()); 
    container.appendChild(node); 
    c = (Container) JAXBContext.newInstance(Container.class).createUnmarshaller().unmarshal(d); 
} 

public Element getElements() { 
    throw new UnsupportedOperationException(); 
} 
} 

(も@XmlRootElement注釈を持ってwhihc)ノードを取得するために@XmlAnyElementを使用して...そして、あなたのコンテナにそれをマーシャリング、このコードは、 醜いです 効率的でない。私はコミットする前にそれをリファクタリングします。

+0

これを使用すると、次のエラーが発生します。 'アンマーシャリングエラー:com.sun.org.apache.xerces.internal.dom.ElementNSImplを....にキャストできません。 'これを私のクラスにキャストするにはどうすればいいですか? – user219882

+0

@Tom:編集を参照 – ekeren

+0

@ekeren:私はそれをしました。しかし、私はプロパティを持っているので、 ''や ''や ''やそれと同じレベルの他の名前をXMLにマッピングしたいと思っています。それだけで動作しません... – user219882

関連する問題