EclipseLink MOXy @XmlPath поддерживает элементы с разными значениями, например. ‹Pty ID=ID1 Src=6 R=1›

Может ли кто-нибудь помочь мне создать тег <Pty ID="ID1" Src="6" R="1">, используя

EclipseLink MOXy @XmlPath в одной аннотации.

Заранее большое спасибо.


person Sreeman    schedule 15.08.2012    source источник
comment
Не могли бы вы обновить свой вопрос, указав, как выглядит ваша модель домена?   -  person bdoughan    schedule 15.08.2012
comment
Мне нужно сгенерировать FIXML с помощью EclipseLink MOXy @XmlPath, как показано ниже. Система имеет только значение идентификатора, основанное на значении идентификатора в одном теге, мне нужно установить значение по умолчанию для атрибутов Src и R. ` ‹Pty ID=ID1 Src=6 R=1› ‹Sub ID=ID1 Typ=1 /› ‹Sub ID=ID2 Typ=4000 /› ‹Sub ID=ID3 Typ=2 /› ‹/Pty› ‹Pty ID =ID2 Src=1 R=2› ‹Sub ID=ID4 Typ=79228162514264337593543950335 /› ‹Sub ID=ID5 Typ=3 /› ‹Sub ID=ID6 Typ=4001 /› ‹/Pty›   -  person Sreeman    schedule 16.08.2012


Ответы (1)


Я не уверен, что правильно понял ваши требования, но вот ответ на то, что, как я думаю, вы пытаетесь сделать.

Адаптер идентификаторов

Вы можете написать XmlAdapter, чтобы преобразовать одно значение идентификатора в объект с несколькими свойствами. Эти другие свойства будут установлены со значениями по умолчанию.

package forum11965153;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class IdAdapter extends XmlAdapter<IdAdapter.AdaptedId, String> {

    public static class AdaptedId {
        @XmlAttribute(name="ID") public String id;
        @XmlAttribute(name="Src") public String src = "6";
        @XmlAttribute(name="R") public String r = "1";
    }

    @Override
    public AdaptedId marshal(String string) throws Exception {
        AdaptedId adaptedId = new AdaptedId();
        adaptedId.id = string;
        return adaptedId;
    }

    @Override
    public String unmarshal(AdaptedId adaptedId) throws Exception {
        return adaptedId.id;
    }
}

Пти

Аннотация @XmlJavaTypeAdapter используется для указания XmlAdapter. Чтобы значения были объединены в корневой элемент, используется аннотация MOXy @XmlPath(".") (см.: http://blog.bdoughan.com/2010/07/xpath-based-mapping.html).

package forum11965153;

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import org.eclipse.persistence.oxm.annotations.XmlPath;

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

    @XmlJavaTypeAdapter(IdAdapter.class)
    @XmlPath(".")
    String id;

}

jaxb.properties

Как вы знаете, чтобы указать MOXy в качестве поставщика JAXB, вам необходимо включить файл с именем jaxb.properties в тот же пакет, что и ваша модель домена, со следующей записью (см.: http://blog.bdoughan.com/search/label/jaxb.properties)

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Демо

Чтобы убедиться, что все работает, можно использовать следующий демонстрационный код:

package forum11965153;

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        StringReader xml = new StringReader("<Pty ID='ID1' Src='6' R='1'/>");
        Pty pty = (Pty) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(pty, System.out);
    }

}

Вывод

Ниже приведен результат запуска демо-кода:

<?xml version="1.0" encoding="UTF-8"?>
<Pty ID="ID1" Src="6" R="1"/>
person bdoughan    schedule 16.08.2012
comment
большое спасибо за вашу помощь. ‹ExecRpt OrdID=OrdID1 OrdID2=OrdID21 ID2=ID21 ExecID2=ExecID21 ID=ID1 OrigID=OrigID1 LnkID=LnkID1 RspID=RspID1 StatReqID=StatReqID1 MassStatReqID=MassStatReqID1 MxPxLvls=1 MaxFloor=1 PosEfct=C MaxShow=1 ID =2 Srcty ID =2 Srcty ID =1 R=2› ‹Sub ID=ID4 Typ=79228162514264337593543950335 /› ‹Sub ID=ID5 Typ=3 /› ‹Sub ID=ID6 Typ=4001 /› ‹/Pty› ‹Pty ID=ID3 Src=IR=3 › ‹Sub ID=ID7 Typ=4 /› ‹Sub ID=ID8 Typ=79228162514264337593543950334 /› ‹Sub ID=ID9 Typ=5 /› ‹/Pty› ‹/ExecRpt› - person Sreeman; 16.08.2012
comment
у меня многоуровневые/иерархические теги. Я хотел бы знать, есть ли возможность сгенерировать «‹Pty ID=ID3 Src=I R=3›» в одном теге. @XmlPath(ExecRpt/Pty/@ID) в том же теге, я хотел бы ввести src и R в один и тот же тег. - person Sreeman; 16.08.2012