2012-02-08 100 views
1

我对JAXB相当陌生,遇到了一个我似乎无法修复的问题。JAXB具有具有相同根的类属性

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

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

我想创建一个类来处理“根”和另一个以进行“测试”。我通常知道你不会这样做,但对于这个例子,这里是我创建的类;

@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

你可以做以下的利用@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; } 
} 

更多信息


UPDATE

如果您正在使用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; } 
} 

更多信息

+0

嗨,谢谢你。不幸的是,MyElement类最终需要包含几个元素。比如我可能需要元素添加到MyElement类: TestStuff 随机文本 user1197930 2012-02-08 20:06:57

+0

对不起 - 而不是单一类应该被称为MyElements。 – user1197930 2012-02-08 20:16:07

+0

@ user1197930 - 我已经更新了我的答案,以及如何使用EclipseLink JAXB(MOXy)中的“@ XmlPath”扩展完成此操作。 – 2012-02-08 20:29:55

相关问题