具有相同根的类属性的JAXB

时间:2012-02-08 19:18:11

标签: java xml jaxb

我是JAXB的新手,遇到了一个我似乎无法解决的问题。

如果我有一个简单的XML文件,如下所示。

<Root>
    <Test>TestStuff</Test>
</Root>

我想创建一个处理“root”的类,另一个处理“test”。我通常知道你不会这样做但是这个例子这里是我创建的类;

@XmlRootElement
class MyElement {
    private String test;
    @XmlElement(name="Test")
    public String getTest() { return test; }
    public void setTest(String test) { this.test = test; }  
}

@XmlRootElement(name="Root")
class Root {
    private MyElement myElement;
    public MyElement getMyElement() { return myElement; }
    public void setMyElement(MyElement myElement) { this.myElement = myElement; }
}

当我运行下面的代码时,我总是为myElement获取null。

@Test
public void testJAXB() throws Exception {
    InputStream xmlInputStream = new FileInputStream(new File(".\\files\\test1.xml"));           
    JAXBContext context = JAXBContext.newInstance(Root.class, MyElement.class);
    Unmarshaller um = context.createUnmarshaller();
    Root root = (Root) um.unmarshal(xmlInputStream);

    Assert.assertTrue(root.getMyElement().getTest().equals("TestStuff"));          
}

有人能指出我正确的方向吗? 感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用@XmlElement@XmlValue

进行以下操作

<强>根

@XmlRootElement(name="Root")
class Root {
    private MyElement myElement;

    @XmlElement(name="Test")
    public MyElement getMyElement() { return myElement; }
    public void setMyElement(MyElement myElement) { this.myElement = myElement; }
}

<强> MyElement

class MyElement {
    private String test;

    @XmlValue
    public String getTest() { return test; }
    public void setTest(String test) { this.test = test; }  
}

了解更多信息


<强>更新

如果您使用EclipseLink MOXy(我是技术主管)作为您的JAXB提供商,您可以使用@XmlPath(".")扩展名来映射此用例。

<强>根

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlRootElement(name="Root")
class Root {
    private MyElement myElement;

    @XmlPath(".")
    public MyElement getMyElement() { return myElement; }
    public void setMyElement(MyElement myElement) { this.myElement = myElement; }
}

<强> MyElement

class MyElement {
    private String test;

    @XmlElement(name="Test")
    public String getTest() { return test; }
    public void setTest(String test) { this.test = test; }  
}

了解更多信息