2010-11-16 33 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; 
}