我有以下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>
@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;
@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()
为空?我遗失了什么?
谢谢!
答案 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;
}
}
感谢您的回答。我尝试了这个但是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
仅供参考,我刚注意到@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")