1

MOXy JAXB を使用して XML ファイルを非整列化しようとしています。生成済みの一連のクラスがあり、必要なすべての XML 要素をモデルにマップするために Xpath を使用しています。

次のような XML ファイルがあります。

<?xml version="1.0" encoding="UTF-8"?>
<fe:Facturae xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
    xmlns:fe="http://www.facturae.es/Facturae/2009/v3.2/Facturae">
    <Parties>
        <SellerParty>
            <LegalEntity>
                <CorporateName>Company Comp SA</CorporateName>
                <TradeName>Comp</TradeName>
                <ContactDetails>
                    <Telephone>917776665</Telephone>
                    <TeleFax>917776666</TeleFax>
                    <WebAddress>www.facturae.es</WebAddress>
                    <ElectronicMail>facturae@mityc.es</ElectronicMail>
                    <ContactPersons>Fernando</ContactPersons>
                    <CnoCnae>28000</CnoCnae>
                    <INETownCode>2134AAB</INETownCode>
                    <AdditionalContactDetails>Otros datos</AdditionalContactDetails>
                </ContactDetails>
            </LegalEntity>
        </SellerParty>
        <BuyerParty>
            <Individual>
                <Name>Juana</Name>
                <FirstSurname>Mauriño</FirstSurname>
                <OverseasAddress>
                    <Address>Juncal 1315</Address>
                    <PostCodeAndTown>00000 Buenos Aires</PostCodeAndTown>
                    <Province>Capital Federal</Province>
                    <CountryCode>ARG</CountryCode>
                </OverseasAddress>
                <ContactDetails>
                    <Telephone>00547775554</Telephone>
                    <TeleFax>00547775555</TeleFax>
                </ContactDetails>
            </Individual>
        </BuyerParty>
    </Parties>
</fe:Facturae>

それから私は私のモデルを持っています:

@XmlRootElement(namespace="http://www.facturae.es/Facturae/2009/v3.2/Facturae", name="Facturae")
public class Facturae implements BaseObject, SecuredObject, CreationDataAware {
    @XmlPath("Parties/SellerParty")
    private Party sellerParty;

    @XmlPath("Parties/BuyerParty")
    private Party buyerParty;
}

public class Party implements BaseObject, SecuredObject, CreationDataAware {
@XmlPath("LegalEntity/ContactDetails")
    private ContactDetails contactDetails;
}

ご覧のとおり、<ContactDetails></ContactDetails><SellerParty></SellerParty>andにあり<BuyerParty></BuyerParty>ますが、この 2 つのタグは同じ JAVA オブジェクト (Party) を共有しています。前のマッピング (@XmlPath("LegalEntity/ContactDetails")) では、SellerParty で ContactDetails 情報を正しく渡すことができますが、同時に ContactDetails も渡したいと考えて<BuyerParty>います。

私はそのようなことを試みていました:

@XmlPaths(value = { @XmlPath("LegalEntity/ContactDetails"),@XmlPath("Individual/ContactDetails") })
    private ContactDetails contactDetails;

しかし、うまくいきません。

手を貸してくれませんか?

どうもありがとうございました。

4

1 に答える 1

0

XmlAdapterこのユースケースには を使用できます。

パーティーアダプター

を使用して、 のインスタンスを別のタイプの objectXmlAdapterに変換します。 の各プロパティに対応する 2 つのプロパティがあります(マッピングの可能性ごとに 1 つ)。のインスタンスを事前に初期化して、その上にのインスタンスを設定する機能を利用します。のインスタンスを使用して、処理しているのインスタンスがかかを判断します。PartyAdaptedPartyAdaptedPartyPartyXmlAdapterFacturaeFacturaePartysellerPartybuyerParty

package forum9807536;

import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.eclipse.persistence.oxm.annotations.XmlPath;

public class PartyAdapter extends XmlAdapter<PartyAdapter.AdaptedParty, Party> {

    private Facturae facturae;

    public PartyAdapter() {
    }

    public PartyAdapter(Facturae facturae) {
        this.facturae = facturae;
    }

    @Override
    public Party unmarshal(AdaptedParty v) throws Exception {
        Party party = new Party();
        if(v.individualName != null) {
            party.setName(v.individualName);
            party.setContactDetails(v.individualContactDetails);
        } else {
            party.setName(v.sellPartyName);
            party.setContactDetails(v.sellerPartyContactDetails);
        }
        return party;
    }

    @Override
    public AdaptedParty marshal(Party v) throws Exception {
        AdaptedParty adaptedParty = new AdaptedParty();
        if(null == facturae || facturae.getSellerParty() == v) {
            adaptedParty.sellPartyName = v.getName();
            adaptedParty.sellerPartyContactDetails = v.getContactDetails();
        } else {
            adaptedParty.individualName = v.getName();
            adaptedParty.individualContactDetails = v.getContactDetails();
        }
        return adaptedParty;
    }

    public static class AdaptedParty {

        @XmlPath("Individual/Name/text()")
        public String individualName;
        @XmlPath("Individual/ContactDetails")
        public ContactDetails individualContactDetails;

        @XmlPath("LegalEntity/CorporateName/text()")
        public String sellPartyName;
        @XmlPath("LegalEntity/ContactDetails")
        public ContactDetails sellerPartyContactDetails;
    }

}

パーティ

を使用してをクラス@XmlJavaTypeAdapterに関連付けます。PartyAdapterParty

package forum9807536;

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

@XmlJavaTypeAdapter(PartyAdapter.class)
public class Party implements BaseObject, SecuredObject, CreationDataAware {
    private String name;
    private ContactDetails contactDetails;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ContactDetails getContactDetails() {
        return contactDetails;
    }

    public void setContactDetails(ContactDetails contactDetails) {
        this.contactDetails = contactDetails;
    }

}

デモ

次のデモ コードは、事前に初期化XmlAdapterされた を に設定する方法を示していMarshallerます。

package forum9807536;

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

public class Demo {

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

        File xml = new File("src/forum9807536/input.xml");
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Facturae facturae = (Facturae) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setAdapter(new PartyAdapter(facturae));
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(facturae, System.out);
    }

}

出力

以下は、マップしたモデルの部分に対応するデモ コードからの出力です。

<?xml version="1.0" encoding="UTF-8"?>
<ns0:Facturae xmlns:ns0="http://www.facturae.es/Facturae/2009/v3.2/Facturae">
   <Parties>
      <BuyerParty>
         <Individual>
            <Name>Juana</Name>
            <ContactDetails/>
         </Individual>
      </BuyerParty>
      <SellerParty>
         <LegalEntity>
            <CorporateName>Company Comp SA</CorporateName>
            <ContactDetails/>
         </LegalEntity>
      </SellerParty>
   </Parties>
</ns0:Facturae>

詳細については

于 2012-03-21T17:50:33.817 に答える