2011-07-20 13 views
6

JAXBの構文解析に苦労しており、いくつかのガイダンスが必要です。JAXB要素に属性を追加する

本質的に、@XmlElementを使用して要素として既に宣言しているクラス変数に属性を追加しようとしています。今のところ@XmlAttributeを使用しようとすると、クラスレベルで属性が設定されます。私はこれを行うにしたいと思い

<DataClass newAttribute="test"> 
    <myElement>I wish this element had an attribute</myElement> 
    <anotherElement>I wish this element had an attribute too</anotherElement> 
</DataClass> 

<DataClass> 
    <myElement thisAtt="this is what I'm talking about">This is better</myElement> 
    <anotherElement thisAtt="a different attribute here">So is this</anotherElement> 
</DataClass> 

私が見てきた他の記事を使用して、単一の要素に属性を追加

は、私が「現在取得mはこれです@XmlValueは、要素があるときには機能しませんが、複数の要素では機能しません。

これを達成する方法について考えている人はいませんか?

ありがとうございます! ジェイソン

+0

あなたはワットので、関連するJavaコードをポストする必要があります実際に何が起こっているか見ることができます。 –

答えて

3

これは、XMLを作成します。

public class JaxbAttributes { 
    public static void main(String[] args) throws Exception { 
     Marshaller marshaller = 
      JAXBContext.newInstance(DataClass.class).createMarshaller(); 
     StringWriter stringWriter = new StringWriter(); 
     DataClass dataClass = new DataClass(
       new Foo("this is what I'm talking about", "This is better"), 
       new Foo("a different attribute here", "So is this")); 
     marshaller.marshal(dataClass, stringWriter); 
     System.out.println(stringWriter); 
    } 

    @XmlRootElement(name = "DataClass") 
    @XmlType(propOrder = {"myElement", "anotherElement"}) 
    static class DataClass { 
     private Foo myElement; 
     private Foo anotherElement; 

     DataClass() {} 
     public DataClass(Foo myElement, Foo anotherElement) { 
      this.myElement = myElement; 
      this.anotherElement = anotherElement; 
     } 

     public Foo getMyElement() { return myElement; } 
     public void setMyElement(Foo myElement) { this.myElement = myElement; } 
     public Foo getAnotherElement() { return anotherElement; } 
     public void setAnotherElement(Foo anotherElement) { this.anotherElement = anotherElement; } 
    } 

    static class Foo { 
     private String thisAtt; 
     private String value; 

     Foo() {} 
     public Foo(String thisAtt, String value) { 
      this.thisAtt = thisAtt; 
      this.value = value; 
     } 

     @XmlAttribute 
     public String getThisAtt() { return thisAtt; } 
     public void setThisAtt(String thisAtt) { this.thisAtt = thisAtt; } 
     @XmlValue 
     public String getValue() { return value; } 
     public void setValue(String value) { this.value = value; } 
    } 
} 
+0

私のfooはあなたの借金です。どうもありがとうございました。私はそのように、その基本的なOOを使用することを考えていなかったが、何らかの理由で私はそれを見ていない。もう一度、ありがとう。 – JasonH

2

注:私はEclipseLink JAXB (MOXy)鉛、およびJAXB 2.X(JSR-222)専門家グループのメンバーです。

また、あなたがこのユースケースを処理するためにMOXYで@XmlPath拡張子を使用することができます。

のDataClass

@XmlPath注釈は、標準JAXB注釈で使用することができます:

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

import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="DataClass") 
@XmlType(propOrder={"myElement", "anotherElement"}) 
public class DataClass { 

    private String myElement; 
    private String myElementThisAtt; 
    private String anotherElement; 
    private String anotherElementThisAtt; 

    public String getMyElement() { 
     return myElement; 
    } 

    public void setMyElement(String myElement) { 
     this.myElement = myElement; 
    } 

    @XmlPath("myElement/@thisAtt") 
    public String getMyElementThisAtt() { 
     return myElementThisAtt; 
    } 

    public void setMyElementThisAtt(String myElementThisAtt) { 
     this.myElementThisAtt = myElementThisAtt; 
    } 

    public String getAnotherElement() { 
     return anotherElement; 
    } 

    public void setAnotherElement(String anotherElement) { 
     this.anotherElement = anotherElement; 
    } 

    @XmlPath("anotherElement/@thisAtt") 
    public String getAnotherElementThisAtt() { 
     return anotherElementThisAtt; 
    } 

    public void setAnotherElementThisAtt(String anotherElementThisAtt) { 
     this.anotherElementThisAtt = anotherElementThisAtt; 
    } 

} 

デモ

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

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

     DataClass dataClass = new DataClass(); 
     dataClass.setMyElement("This is better"); 
     dataClass.setMyElementThisAtt("this is what I'm talking about"); 
     dataClass.setAnotherElement("So is this"); 
     dataClass.setAnotherElementThisAtt("a different attribute here"); 

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

出力

<?xml version="1.0" encoding="UTF-8"?> 
<DataClass> 
    <myElement thisAtt="this is what I'm talking about">This is better</myElement> 
    <anotherElement thisAtt="a different attribute here">So is this</anotherElement> 
</DataClass> 

詳細情報

関連する問題