我是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"));
}
有人能指出我正确的方向吗? 感谢。
答案 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; }
}
了解更多信息