Лучший способ сопоставить XML с непревзойденным POJO

Каков «правильный» способ обработки сопоставления одного XML (xmlA) с созданными jaxb pojo, которые сопоставляются с другим контрактом XML (xmlB)

Например, со следующим вводом:

<?xml version="1.0"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
   </book>
</catalog>

Я хочу сопоставить следующий класс

public class PART
{
    private String ITEM;

    private String MANUFACTURER;


    @Override
    public String toString()
    {
        return "ClassPojo [ITEM = "+ITEM+", MANUFACTURER = "+MANUFACTURER+"]";
    }
}

где автор сопоставляется с ПУНКТ, а заголовок сопоставляется с ПРОИЗВОДИТЕЛЕМ.

В настоящее время я использую преобразования xml, а затем сопоставляю их; это лучший/правильный способ сделать это? Или каков отраслевой стандарт для такой проблемы.

Спасибо


person David Lemporo    schedule 14.09.2015    source источник
comment
Взгляните на: документы .oracle.com/javase/7/docs/api/javax/xml/bind/annotation/   -  person Ryan J    schedule 15.09.2015
comment
Вы говорите о сгенерированных jaxb pojo, но не показываете их. Они похожи на классы с именами Catalog и Book, поэтому вы сопоставляете Book с PART после того, как JAXB рассортирует для вас Book. Не знаю, зачем вам нужны и преобразование xml, и сопоставление.   -  person Andreas    schedule 15.09.2015


Ответы (1)


Примечание. Имена классов должны быть в смешанном регистре (Part), а имена полей должны быть в нижнем регистре или, скорее, в верблюжьем регистре (item и manufacturer).


Вы можете указать имя элемента в аннотации @XmlElement.

public class Test {
    public static void main(String[] args) throws Exception {
        String xml = "<?xml version=\"1.0\"?>\n" +
                     "<catalog>\n" +
                     "   <book id=\"bk101\">\n" +
                     "      <author>Gambardella, Matthew</author>\n" +
                     "      <title>XML Developer's Guide</title>\n" +
                     "   </book>\n" +
                     "</catalog>";
        JAXBContext jc = JAXBContext.newInstance(Catalog.class, PART.class);
        Unmarshaller u = jc.createUnmarshaller();
        Catalog catalog = (Catalog)u.unmarshal(new StringReader(xml));
        for (PART part : catalog.parts)
            System.out.println(part.toString());
    }
}

@XmlRootElement(name="catalog")
class Catalog {
    @XmlElement(name="book")
    List<PART> parts;
}

class PART
{
    @XmlElement(name="author")
    private String ITEM;

    @XmlElement(name="title")
    private String MANUFACTURER;

    @Override
    public String toString()
    {
        return "ClassPojo [ITEM = "+ITEM+", MANUFACTURER = "+MANUFACTURER+"]";
    }
}

Вывод

ClassPojo [ITEM = Gambardella, Matthew, MANUFACTURER = XML Developer's Guide]
person Andreas    schedule 15.09.2015
comment
Я не могу изменить файлы классов для PART, которые уже имеют разные имена элементов. - person David Lemporo; 15.09.2015