JAXB со свойством класса с тем же корнем - PullRequest
1 голос
/ 08 февраля 2012

Я довольно новичок в 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.

@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 Ответ

1 голос
/ 08 февраля 2012

Вы можете выполнить следующие действия, используя @XmlElement и @XmlValue:

Root

@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(".") расширение для сопоставления этого варианта использования.

Root

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; }  
}

Для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...