java - 使用 JaXB 解码后获取 null?

标签 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;

Alexa结果

@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() 为 null ?我错过了什么吗?

谢谢!

最佳答案

假设

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

<小时/>

原始答案

您应该将包级别 @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;

Alexa结果

由于 TrafficHistoryResponse 元素是唯一具有不同命名空间的元素,因此请使用 @XmlRootElement 注释上的 namespace 属性将其覆盖为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

Thanks for your answer. I tried this but alexaResponse is coming as null. any suggestion?

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

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

仅供引用,我刚刚注意到您应该在 HistoricalData 类的 data 属性上添加 @XmlElementWrapper(name="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 实例编码(marshal)回 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>

关于java - 使用 JaXB 解码后获取 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26461089/

相关文章:

java - 如何在 HttpDecompressor 之前添加 GlobalTrafficShapingHandler

java - 从部分 XML 向 TableLayout 添加更多行

java - 从 Spring 4.x 升级到 5.x 时获取 "InvalidPathException: Illegal char <*>"

java - 如何使用 JAXB 排除某些属性以将其转换为 xml

java - 解析一棵知道叶节点的所有父节点和祖先节点的树

java - 为什么不使用上次提交来构建 TeamCity 项目?

xml - libxml2 是否支持 XSD 1.1

java - 当 XSD 的一部分嵌套在 WSDL 中时如何将架构添加到 Marshaller

java - Eclipse Java 编辑器突出显示错误但代码可以编译

java - Android 错误尝试在空对象引用上调用虚拟方法