2010-11-16 32 views
2

我升級,目前在這種精神的XML表示Java對象:註釋的追加屬性的一個元素

<myObjects> 
    <myObject uid="42" type="someEnum"> 
     <name>Waldo</name> 
     <description>yada yada</description> 
     <myElement>some_string</myElement> 
     ... 
    </myObject> 
    ... 
</myObjects> 

myElement是可選的 - 它可以在Java中爲空/省略XML。
我添加一個字段是只有相關的,如果myElement具有實際價值 (並保持與以前的XML兼容性,它本身可選)

我試圖避免這種情況:

<myElement>some_string</myElement> 
    <myAttr>foo</myAttr> 

和喜歡的東西是這樣的:

<myElement myAttr="foo">some_string</myElement> 

但敲我的頭2天沒有w如何對其進行註釋。

  • 我想用XmlTransient其標記的,讓一個XmlAnyElement將捕捉它,而不是在解 - 但似乎從Java編組對象時回到XML,這將導致一個問題。
  • 我試着爲元素創建一個XmlAdapter - 但解組方法只獲取內部內容(「some_string」)。 我是否錯過了這種技術?
  • 有沒有辦法來剛剛得到的元素作爲一個字符串( 「< myElement myAttr = \ 」福\「 > some_string </myElement >」),我會過程中它自己?
  • 您是否推薦其他方法?
+0

我們需要看到你的java – skaffman 2010-11-16 12:29:31

+0

如果不清楚 - 我只需要保持與以前的XML文件的兼容性。我可以用Java代碼做任何我想做的事情。所以我故意沒有提供它,爲了不偏袒你(Blaise Doughan插入它下面很好)。 – targumon 2010-11-24 10:00:12

回答

3

可以使用EclipseLink JAXB (MOXy) @XmlPath擴展輕鬆實現這一點:

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlRootElement; 

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

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class MyObject { 

    @XmlAttribute 
    private int uid; 

    @XmlAttribute 
    private String type; 

    private String name; 

    private String description; 

    private String myElement; 

    @XmlPath("myElement/@myAttr") 
    private String myAttr; 

} 

本課程將與下面的XML交互:

<myObject uid="42" type="someEnum"> 
    <name>Waldo</name> 
    <description>yada yada</description> 
    <myElement myAttr="foo">some_string</myElement> 
</myObject> 

使用下面的演示代碼:

import java.io.File; 

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

public class Demo { 

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

     File file = new File("input.xml"); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     MyObject myObject = (MyObject) unmarshaller.unmarshal(file); 

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

} 

要指定MOXy作爲您的JAXB實現,您需要包含一個名爲jaxb的文件。在同一個包中的以下項屬性的模型類:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

欲瞭解更多有關莫西的XPath的基礎測繪看到:

+0

最終我沒有使用你的解決方案(見下面我自己的答案)。 但是我確實從你的解釋和博客中學到了很多東西,所以我把它標記爲「接受」:-) – targumon 2010-11-24 10:00:41

1

答案很簡單:我很習慣用XmlElementXmlAttribute,那我忘了XmlValue

爲MyObject的代碼是一樣的布萊斯Doughan答案,有一個變化: myElement現在是一個類(ElemWithAttr),而不是字符串:

public class ElemWithAttr { 
    @XmlValue 
    public String content; 

    @XmlAttribute 
    public String myAttr; 
}