Сопоставление между Java и XML - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь сопоставить POJO с XML.Теперь POJO состоит из некоторых атрибутов, которые являются основными String / Integer и т. Д., И некоторых, которые являются другими классами POJO.Файл сопоставления xml, который я пытаюсь создать, я хочу, чтобы элемент xml на верхнем уровне был заполнен атрибутом java глубиной 2 уровня.

например, если у меня есть 2 java-класса `

class classA{

private ClassB var1
private String var2

}

class classB{
private ClassC var3;
}

class classC{
private String var4;
}

Теперь мое отображение XML выглядит так:

Отображение CruiseLine

<class name="ClassA"
    auto-complete="false"
>
    <map-to xml="Sample" />
    <field name="var2">
        <bind-xml node="attribute" name="var2" />
    </field>
    <field name="var4 from classC">
        <I want a mapping for the var4 from classC to appear here. How do I do that ?>
</class>

`Как видите, я хочу сопоставление для var4 из classC в элементе xml Sample.Я хочу, чтобы это был элемент образца.

`

<Sample var2="value">
     <data var4="var4 value">
</Sample>

`

Помощь оценена!

Ответы [ 2 ]

1 голос
/ 03 апреля 2012

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

Блейз: я раньше не пользовался EclipseLink, однако думаю, что смогу выйти из рицинуса, если EclipseLink сравнительно просто принять? Просто весь проект использует Castor, поэтому более последовательный Однако не могли бы вы рассказать об Eclipselink. Благодарю. - TYS

EclipseLink MOXy - это реализация JAXB (JSR-222). Глядя на ваш вопрос, эта модель может быть сопоставлена ​​с желаемым XML с помощью любой реализации JAXB следующим образом:

ClassA

package forum9994762;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Sample")
@XmlAccessorType(XmlAccessType.FIELD)
public class ClassA {

    @XmlElement(name="data")
    private ClassB var1;

    @XmlAttribute
    private String var2;

}

ClassB

package forum9994762;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class ClassB {

    @XmlAttribute(name="var4")
    private ClassC var3;

}

ClassC

package forum9994762;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class ClassC {

    @XmlValue
    private String var4;

}

Демо

package forum9994762;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(ClassA.class);

        File xml = new File("src/forum9994762/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        ClassA classA = (ClassA) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(classA, System.out);
    }

}

Input.xml / выход

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Sample var2="value">
    <data var4="var4 value"/>
</Sample>
<Ч />

Файл сопоставления

Как пользователь Castor, вы можете предпочесть представление своих метаданных в виде внешнего файла сопоставления. EclipseLink MOXy предлагает такое расширение:

binding.xml

<?xml version="1.0" encoding="UTF-8"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="forum9994762"
    xml-accessor-type="FIELD">
    <java-types>
        <java-type name="ClassA">
            <xml-root-element name="Sample"/>
            <java-attributes>
                <xml-element java-attribute="var1" name="data"/>
                <xml-attribute java-attribute="var2"/>
            </java-attributes>
        </java-type>
        <java-type name="ClassB">
            <java-attributes>
                <xml-attribute java-attribute="var3" name="var4"/>
            </java-attributes>
        </java-type>
        <java-type name="ClassC">
            <java-attributes>
                <xml-value java-attribute="var4"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

Демо

package forum9994762;

import java.io.File;
import java.util.*;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.JAXBContextFactory;

public class Demo {

    public static void main(String[] args) throws Exception {
        Map<String, Object> properties = new HashMap<String, Object>(1);
        properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, "forum9994762/binding.xml");
        JAXBContext jc = JAXBContext.newInstance("forum9994762", ClassA.class.getClassLoader(), properties);

        File xml = new File("src/forum9994762/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        ClassA classA = (ClassA) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(classA, System.out);
    }

}

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

0 голосов
/ 14 мая 2012

Если вы используете auto-complete=false в своем файле mapping.xml для ClassA <class name="ClassA" auto-complete="false" >, вы должны указать маршаллеру Castor, как сопоставлять ClassB и ClassC по отдельности.Включение этих двух строк может помочь вам начать работу:

<class name="ClassB" auto-complete="true">
 <map-to xml="class-B" />
</class>
<class name="ClassC" auto-complete="true">
 <map-to xml="class-C" />
</class>

Но поскольку var4 является членом ClassC, но не ClassB, он будет на один уровень глубоко внутри вашей выходной иерархии xml.

...