2012-03-21 6 views
1

MOXy JAXBを使用してXMLファイルをアンマーシャリングしようとしています。私は既に生成された一連のクラスを持っています。私は必要なすべてのXML要素をモデルにマップするためにXpathを使用しています。MOXy JAXB:いくつかのXMLタグ要素を同じJAVA beanプロパティにマップする方法

私はこのような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>[email protected]</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><BuyerParty></BuyerParty>中に存在するが、この二つのタグが共有します同じJAVAオブジェクト(Party)。以前のマッピング(@XmlPath( "LegalEntity/ContactDetails"))では、SellerPartyのContactDetails情報を正しく渡すことができますが、同時にContactDetailsを<BuyerParty>に渡したいと思っています。

私はそのような何かしようとしていた:

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

を、それは動作しません。

あなたは私に手を差し伸べることができますか?

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

答えて

0

あなたはこのユースケースのためXmlAdapterを使用することができます。

PartyAdapter

我々は、オブジェクトAdaptedPartyの別の型にPartyのインスタンスを変換するXmlAdapterを使用します。 AdaptedPartyは、Partyの各プロパティに対応する2つのプロパティを持ちます(マッピング可能性ごとに1つ)。 XmlAdapterのインスタンスを事前初期化して、インスタンスをFacturaeに設定する機能を利用します。 Facturaeのインスタンスを使用してPartyのインスタンスがsellerPartyまたはbuyerPartyであるかどうかを判断します。

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; 
    } 

} 

パーティー

我々はPartyクラスにPartyAdapterを関連付けるために@XmlJavaTypeAdapterを使用します。

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; 
    } 

} 

デモ

次のデモコードは設定する方法を示しています事前に初期化された0 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> 

詳細情報

+1

どうもありがとう、これは完璧です! – rocotocloc

関連する問題