сопоставление двух xmls с разными именами rootelement одному и тому же объекту java - PullRequest
1 голос
/ 20 октября 2011

У меня есть

xml1:
<abc><name>hello</name></abc>

xml2
<xyz><name>hello</name></xyz>

I have one java class. 

@XmlRootElement(name="abc") (this 
public class Foo{
   @XmlElement
   String name;
}

Я не хочу другой класс, но хотел бы разместить xml2 с самим классом Foo.Я могу перехватить или изменить его во время предварительной сортировки / предварительной сортировки.

Спасибо!

}

Ответы [ 2 ]

1 голос
/ 20 октября 2011

В зависимости от того, что именно вы подразумеваете под «Я не хочу другого класса», возможно, это сработает для вас:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import java.io.StringReader;

public class JaxbBindTwoRootElementsToSameClass {
    public static void main(String[] args) throws Exception {
        String xml1 = "<abc><name>hello</name></abc>";
        String xml2 = "<xyz><name>hello</name></xyz>";
        Unmarshaller unmarshaller = JAXBContext.newInstance(Foo.class).createUnmarshaller();
        Object o1 = unmarshaller.unmarshal(new StringReader(xml1));
        Object o2 = unmarshaller.unmarshal(new StringReader(xml2));
        System.out.println(o1);
        System.out.println(o2);
    }

    @XmlSeeAlso({Foo.Foo_1.class, Foo.Foo_2.class})
    static class Foo {
        @XmlRootElement(name = "abc")
        static class Foo_1 extends Foo {}

        @XmlRootElement(name = "xyz")
        static class Foo_2 extends Foo {}

        @XmlElement
        String name;

        @Override
        public String toString() {
            return "Foo{name='" + name + '\'' + '}';
        }
    }
}

Выход:

Foo{name='hello'}
Foo{name='hello'}

Преимущество использования JAXB почти такое же, как обычно. Это просто немного нетрадиционная организация класса. Вам даже нужно только передать Foo.class в JAXBContext при его создании. Не нужно возиться с внутренними компонентами JAXB.

0 голосов
/ 20 октября 2011

Unmarshalling

Вы можете использовать немаршальные методы, которые принимают параметр класса.Когда указан класс, реализация JAXB не должна использовать корневой элемент для определения класса, который нужно маршалировать.

Marshalling

При маршалинге вы можете обернуть корневойобъект в JAXBElement для предоставления информации о корневом элементе.

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