Jaxb Annotations - Извлекает значение xml из элемента xml - PullRequest
1 голос
/ 27 июля 2011

1.) У меня есть файл XSD (я не контролирую его), который я преобразовал в объектную модель с помощью JAXB

2.) У меня есть извлечение базы данных в формате XML. Имена тегов элемента XML являются строго именами полей таблицы

3.) Я сопоставил элементы xml с классом Java с помощью аннотаций.

Вопрос. Есть ли способ сохранить имена элементов в файле XSD и просто извлечь значение элементов xml.

JAXB аннотированный класс:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Item", propOrder = {
    "code",
    "name",
    "price"
})
@XmlRootElement(name="inventory")
public class Item {

    @XmlElement(name="catalog_num", required = true)
    protected String code;

    @XmlElement(name="catalog_descrip", required = true)
    protected String name;

    @XmlElement(name="prod_price")
    protected double price;


    public String getCode() {
        return code;
    }
//etc

Выдержка из файла базы данных xml:

<?xml version="1.0"?>
<inventory>
          <catalog_num>I001</catalog_num>
          <catalog_descrip>Descriptive Name of Product</catalog_descrip>
          <prod_price>11200</prod_price>
</inventory>

Результат, который мне нужно получить после маршалинга вышеуказанного XML-файла:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Item>
    <code>I001</code>
    <name>Descriptive Name of Product</name>
    <price>11200.0</price>
</Item>

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

Надеюсь, у меня есть смысл.

Ответы [ 2 ]

1 голос
/ 27 июля 2011

Примечание: Я являюсь лидером EclipseLink JAXB (MOXy) и членом группы экспертов JAXB ( JSR-222 ).

MOXy предлагает расширение, в котором вы можете применить вторую привязку XML через документ XML. Этот документ связывания может использоваться для добавления метаданных или когда xml-mapping-metadata-complete="true" полностью заменяет метаданные, предоставленные аннотациями JAXB для модели Java;

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum6838882" 
    xml-mapping-metadata-complete="true">
    <java-types>
        <java-type name="Item" xml-accessor-type="FIELD">
            <xml-root-element name="Item"/>
        </java-type>
    </java-types>
</xml-bindings>

Файл привязок передается в качестве параметра при создании JAXBContext:

Map<String, Object> properties = new HashMap<String, Object>();
properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum6838882/binding.xml");
JAXBContext resultJC = JAXBContext.newInstance(new Class[] {Item.class}, properties);

Чтобы решить вашу проблему, вы можете создать один JAXBContext для обработки документа базы данных (используя аннотированные классы) и создать второй JAXBContext для обработки формата результата с использованием файла привязки MOXy. Вот как это будет выглядеть:

package forum6838882;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext databaseJC = JAXBContext.newInstance(Item.class);
        Unmarshaller databaseUnmarshaller = databaseJC.createUnmarshaller();
        File databaseXML = new File("src/forum6838882/database.xml");
        Item item = (Item) databaseUnmarshaller.unmarshal(databaseXML);

        Map<String, Object> properties = new HashMap<String, Object>();
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum6838882/binding.xml");
        JAXBContext resultJC = JAXBContext.newInstance(new Class[] {Item.class}, properties);
        Marshaller resultMarshaller = resultJC.createMarshaller();
        resultMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        resultMarshaller.marshal(item, System.out);
    }
}

Более подробный пример см .:

1 голос
/ 27 июля 2011

Если я правильно понимаю, вы пытаетесь маршалировать и демаршалировать объект двумя разными способами.Хотя это не совсем та ситуация, для которой он предназначен, вы можете использовать для этого XmlJavaTypeAdapter .Здесь есть учебник .

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