2012-03-21 205 views
1

我想使用MOXy JAXB解組一個XML文件。我有一組已經生成的類,我使用Xpath將我需要的每個XML元素映射到我的模型中。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信息,但我還想同時傳遞<BuyerParty>中的ContactDetails。

我是想這樣的事情:

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

,但它不工作。

你們能幫我一把嗎?

非常感謝。

回答

0

你可以使用一個XmlAdapter這個用例:

PartyAdapter

我們將使用XmlAdapterParty實例轉換爲另一種類型的對象AdaptedParty的。 AdaptedParty將具有與Party中的每個屬性相對應的兩個屬性(每個映射可能性有一個屬性)。我們將利用能夠預先初始化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; 
    } 

} 

我們將使用@XmlJavaTypeAdapterPartyAdapter關聯到Party類:

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

} 

演示

下面的演示代碼演示瞭如何設置一個預先初始化的XmlAdapterMarshaller

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 2012-03-22 11:17:20

相關問題