2012-03-21 198 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

相关问题