【问题标题】:Unmarshalling an array of objects and arrays解组对象和数组的数组
【发布时间】:2010-06-03 11:57:03
【问题描述】:

您好,我对 XML 和 Web 服务非常陌生,但我从 SOAP Web 服务接收 XML,看起来像这样:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <ArrayOfCreditCardSettlement xmlns="http://schemas.datacontract.org/2004/07/Borgun.Library.Common">
      <ns0:CreditCardSettlement xmlns="http://Borgun.Services.Gateway/2010/04/Settlement" xmlns:a="http://schemas.datacontract.org/2004/07/Borgun.Library.Common" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:msgns="http://Borgun.Services.Gateway/2010/04/Settlement" xmlns:ns0="http://schemas.datacontract.org/2004/07/Borgun.Library.Common" xmlns:ns1="http://j2ee.netbeans.org/wsdl/BorgunTestBPEL/entrypoint_getSettlements">
        <a:amexAmount>**</a:amexAmount>
        <a:amount>**</a:amount>
        <a:batches>
          <a:CreditCardBatch>
            <a:batchdate>***</a:batchdate>
            <a:batchnumber>***</a:batchnumber>
            <a:currencyCode>***</a:currencyCode>
            <a:merchantnumber>***</a:merchantnumber>
            <a:settlementRunNumber>***</a:settlementRunNumber>
            <a:settlementdate>***</a:settlementdate>
            <a:slips>*</a:slips>
            <a:sum>***</a:sum>
          </a:CreditCardBatch>
          .
          . 
           more batches

        <a:deductionItems>
            <a:CreditCardSettlementDeduction>
               <a:amount>***</a:amount>
               <a:code>**</a:code>
               <a:currencyCode>**</a:currencyCode>
               <a:merchantnumber>***</a:merchantnumber>
               <a:settlementrunnumber>***</a:settlementrunnumber>
               <a:text>***</a:text>
            </a:CreditCardSettlementDeduction>
         .
         . more deductionitems 
         </ns0:CreditCardSettlement>
         .
         . more Settlements

我使用 Netbeans 创建了一个似乎可以工作的 jaxb 绑定

 try
    {
        JAXBContext jc = JAXBContext.newInstance("is.skyrr.jaxbbinding");
        Unmarshaller unmarshaller = jc.createUnmarshaller();

        Object o = (Object) unmarshaller.unmarshal(new File("....response3.xml"));


    } catch (JAXBException ex)
    {
        Logger.getLogger(TestDB.class.getName()).log(Level.SEVERE, null, ex);
    }

绑定生成,有“ArrayOfCreditCardSettlement”、“CreditCardSettlement”和objectfactory等。

现在我在这里唯一能做的就是强制转换为 JAXBElement

即`JAXBElement a = (JAXBElement) unmarshaller.unmarshal(new File("...response3.xml"));

也许这就是我应该拥有的,但我应该如何使用它?

我希望使用该数组/列表,但我不知道下一步该做什么。

附加信息: 绑定是从 xsd 生成的

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ArrayOfCreditCardSettlement", propOrder = {
"creditCardSettlement"})
  public class ArrayOfCreditCardSettlement {

@XmlElement(name = "CreditCardSettlement", nillable = true)
protected List<CreditCardSettlement> creditCardSettlement;

public List<CreditCardSettlement> getCreditCardSettlement() {
    if (creditCardSettlement == null) {
        creditCardSettlement = new ArrayList<CreditCardSettlement>();
    }
    return this.creditCardSettlement;
}

CreditCardSettlement 类类似。

对象工厂有 XMLElementDecl 显式命名命名空间等等

【问题讨论】:

    标签: java xml-serialization jaxb


    【解决方案1】:
    1. 我很确定您不能将 Collection 作为顶级对象。
    2. 您是否设置了 POJO 和 ObjectFactory?您应该能够直接解组到您的目标对象。例如

      CreditCardSettlementContainer ccsc = (CreditCardSettlementContainer) unmarshaller.unmarshal(yourFile);
      

    参考:JAXB tutorial

    另一方面,如果您刚刚开始,我强烈推荐 Simple XML非常更易于理解和使用,更不用说更灵活了。

    【讨论】:

    • 感谢您的链接,我试图直接解组到目标对象,但无论出于何种原因它都不起作用。我没有选择 SimpleXML 的奢侈,但感谢您的回复
    【解决方案2】:

    JAXBElement 有一个值,它应该是一个ArrayOfCreditCardSettlement 对象。

    这是一个可以提供一些提示的代码示例: http://www.java2s.com/Code/Java/XML/UnmarshalltoJAXBElement.htm

    【讨论】:

    • 非常感谢,值钱的东西完全避开了我的视线
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 2022-12-04
    • 1970-01-01
    • 2020-05-02
    • 2017-12-06
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多