2011-07-20 11 views
6

Bazı JAXB ayrıştırmalarıyla uğraşıyorum ve biraz yönlendirmeye ihtiyacım var.JAXB Öğesine bir Özellik Ekleme

Esasen, @XmlElement kullanarak Elements olarak bildirdiğim sınıf değişkenlerime öznitelikleri eklemeye çalışıyorum. Şimdiye kadar, @XmlAttribute işlevini kullanma girişimi, özniteliği sınıf düzeyinde ayarlar. Bunu yapmak için istiyorum

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

gördüğüm diğer mesajları kullanarak tek öğeye bir özelliği eklemelerini

Ne "şu anda alıyorum şudur @XmlValue, ancak Elemanlarınız olduğunda işe yaramıyor ve birden çok öğe üzerinde çalışmayacaksınız

Bunun nasıl gerçekleştirilebileceği konusunda bir fikri olan var mı?

Teşekkürler! Jason Bunun anlamı XML yaratacak

+0

Sen w böylece ilgili Java kodunu yayınlamanız gerekir e aslında neler olduğunu görebilir. –

cevap

3

:

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

Benim foo senin borcun içinde. Çok teşekkür ederim. Bu şekilde kullanmayı düşünmemiştim, temel OO'su ama bir sebepten dolayı görmedim. Bir kez daha, çok teşekkür ederim. – JasonH

2

Not: Ben EclipseLink JAXB (MOXy) Başkanıyım ve JAXB 2.x üyesi (JSR-222) uzmanlar grubu.

DataClass

@XmlPath açıklama standart JAXB ek açıklamaları ile kullanılabilir:

Alternatif bu kullanım durumda idare Moxy içinde @XmlPath uzantısını kullanabilirsiniz

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; 
    } 

} 

Gösterisi

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); 
    } 
} 

Çıktı

<?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> 

Fazla Bilgi