使用JaXB解组后获取null?

时间:2014-10-20 08:10:55

标签: java xml jaxb

我有以下XML。

<?xml version="1.0"?>
<aws:TrafficHistoryResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
    <aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11">
        <aws:OperationRequest>
            <aws:RequestId>6b09364e-ac0d-686c-cb95-0b1393fd234e</aws:RequestId>
        </aws:OperationRequest>

        <aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
            <aws:StatusCode>Success</aws:StatusCode>
        </aws:ResponseStatus>
    </aws:Response>
</aws:TrafficHistoryResponse>

POJO课程:

package-info.java

@javax.xml.bind.annotation.XmlSchema(namespace = "http://alexa.amazonaws.com/doc/2005-10-05/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.mycom.web;

AlexaResult

@XmlRootElement(name = "TrafficHistoryResponse")
public class AlexaResult implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -3068403572663448394L;


    private AlexaResponse alexaResponse;

    @XmlElement(name="Response", namespace="http://awis.amazonaws.com/doc/2005-07-11")
    public AlexaResponse getAlexaResponse() {
        return alexaResponse;
    }

    public void setAlexaResponse(AlexaResponse alexaResponse) {
        this.alexaResponse = alexaResponse;
    }




}




JAXBContext jaxbContext = JAXBContext.newInstance(AlexaResult.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        StringReader reader = new StringReader(webTrafficDetails);
        AlexaResult result = (AlexaResult) unmarshaller.unmarshal(reader);

但我得result.getAlexaResponse().getAlexaHistoryResult()为空?我遗失了什么?

谢谢!

2 个答案:

答案 0 :(得分:2)

假设

所有模型类都在同一个包中


原始答案

您应该将包级别@XmlSchema注释上的命名空间更改为最常用的命名空间http://awis.amazonaws.com/doc/2005-07-11

<强> package-info.java

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://awis.amazonaws.com/doc/2005-07-11", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.mycom.web;

<强> AlexaResult

由于TrafficHistoryResponse元素是唯一具有不同命名空间的元素,因此请使用namespace注释上的@XmlRootElement属性将其覆盖为http://alexa.amazonaws.com/doc/2005-10-05/

@XmlRootElement(name = "TrafficHistoryResponse", namespace="http://alexa.amazonaws.com/doc/2005-10-05/")
public class AlexaResult implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = -3068403572663448394L;


    private AlexaResponse alexaResponse;

    @XmlElement(name="Response")
    public AlexaResponse getAlexaResponse() {
        return alexaResponse;
    }

    public void setAlexaResponse(AlexaResponse alexaResponse) {
        this.alexaResponse = alexaResponse;
    }

}

更新#1

  

感谢您的回答。我尝试了这个但是alexaResponse即将到来   空值。有什么建议吗?

当我进行上述两项更改并运行以下代码时:

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

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jaxbContext = JAXBContext.newInstance(AlexaResult.class);
        Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

        File xml = new File("input.xml");
        AlexaResult result = (AlexaResult) unmarshaller.unmarshal(xml);
        System.out.println(result.getAlexaResponse().getAlexaHistoryResult());
    }

}

我得到以下输出:

com.mycom.web.AlexaHistoryResult@5872922a

更新#2

仅供参考,我刚注意到@XmlElementWrapper(name="HistoricalData")课程中的data媒体资源应该HistoricalData

import java.io.Serializable;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;

public class HistoricalData implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 1284437498477880205L;

    private List<Data> data;

    @XmlElementWrapper(name="HistoricalData")
    @XmlElement(name = "Data")
    public List<Data> getData() {
        return data;
    }

    public void setData(List<Data> data) {
        this.data = data;
    }

}

<强>输出

通过第二次更新,下面是我将AlexaResult的实例编组回XML时的结果。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:TrafficHistoryResponse xmlns="http://awis.amazonaws.com/doc/2005-07-11" xmlns:ns2="http://alexa.amazonaws.com/doc/2005-10-05/">
    <Response>
        <TrafficHistoryResult>
            <Alexa>
                <TrafficHistory>
                    <HistoricalData>
                        <Data>
                            <Date>2014-09-17</Date>
                            <PageViews>
<PerMillion>127970</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>507000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-18</Date>
                            <PageViews>
<PerMillion>125880</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>503000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-19</Date>
                            <PageViews>
<PerMillion>120840</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>497000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-20</Date>
                            <PageViews>
<PerMillion>86640</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>461000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-21</Date>
                            <PageViews>
<PerMillion>85550</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>463000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-22</Date>
                            <PageViews>
<PerMillion>130800</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>507000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-23</Date>
                            <PageViews>
<PerMillion>128410</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>501000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-24</Date>
                            <PageViews>
<PerMillion>127350</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>502000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-25</Date>
                            <PageViews>
<PerMillion>125800</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>499000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-26</Date>
                            <PageViews>
<PerMillion>123290</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>493000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-27</Date>
                            <PageViews>
<PerMillion>87840</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>459000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-28</Date>
                            <PageViews>
<PerMillion>86350</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>462000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-29</Date>
                            <PageViews>
<PerMillion>130110</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>500000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-09-30</Date>
                            <PageViews>
<PerMillion>130220</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>498000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-01</Date>
                            <PageViews>
<PerMillion>131730</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>500000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-02</Date>
                            <PageViews>
<PerMillion>127800</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>496000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-03</Date>
                            <PageViews>
<PerMillion>100820</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>461500</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-04</Date>
                            <PageViews>
<PerMillion>73500</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>421300</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-05</Date>
                            <PageViews>
<PerMillion>72850</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>427600</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-06</Date>
                            <PageViews>
<PerMillion>100790</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>467800</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-07</Date>
                            <PageViews>
<PerMillion>103560</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>469200</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-08</Date>
                            <PageViews>
<PerMillion>103220</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>471900</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-09</Date>
                            <PageViews>
<PerMillion>104180</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>470700</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-10</Date>
                            <PageViews>
<PerMillion>97980</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>461700</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-11</Date>
                            <PageViews>
<PerMillion>76100</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>437200</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-12</Date>
                            <PageViews>
<PerMillion>74820</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>435900</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-13</Date>
                            <PageViews>
<PerMillion>102590</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>469300</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-14</Date>
                            <PageViews>
<PerMillion>103400</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>467400</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-15</Date>
                            <PageViews>
<PerMillion>103040</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>475000</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-16</Date>
                            <PageViews>
<PerMillion>102640</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>465400</PerMillion>
                            </Reach>
                        </Data>
                        <Data>
                            <Date>2014-10-17</Date>
                            <PageViews>
<PerMillion>99020</PerMillion>
                            </PageViews>
                            <Rank>1</Rank>
                            <Reach>
<PerMillion>459800</PerMillion>
                            </Reach>
                        </Data>
                    </HistoricalData>
                </TrafficHistory>
            </Alexa>
        </TrafficHistoryResult>
    </Response>
</ns2:TrafficHistoryResponse>

答案 1 :(得分:0)

请注意,您更改了aws命名空间:

xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/"

xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11"

首先,确保这是核心。

接下来,如果是这种情况,那么您的文档中的元素位于不同的命名空间中。在这种情况下,您基本上有两个选项:

  • 使用package-info.java定义最常用的命名空间(在这种情况下,我认为这将是http://awis.amazonaws.com/doc/2005-07-11)。在使用此命名空间的namespace(和其他注释)中省略@XmlElements
  • 请勿使用package-info.java并在所有namespace中撰写@XmlElements

package-info.java可以提供“默认”命名空间,用于“限定”元素(由@XmlElement@XmlElements@XmlElementWrapper@XmlElementRef定义,@XmlElementRefs)如果他们没有提供namespace。但您也可以明确提供namespace

@XmlElement(name="TrafficHistoryResult",
            namespace="http://awis.amazonaws.com/doc/2005-07-11")