Java 在使用JaXB解组后获取null?
我有下面的XMLJava 在使用JaXB解组后获取null?,java,xml,jaxb,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>
<?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>
AlexaResult
但是我得到的result.getAlexaResponse().getAlexaHistoryResult()
为空?我遗漏了什么
谢谢 请注意,您将
aws
名称空间从以下位置更改为:
xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/"
到
首先,确保这是正确的
接下来,如果是这种情况,那么您的文档中有不同名称空间中的元素。在这种情况下,基本上有两种选择:
- 使用
定义最常用的名称空间(我认为这将是package info.java
在这种情况下)。在使用此名称空间的http://awis.amazonaws.com/doc/2005-07-11
(以及其他注释)中省略@XmlElements
名称空间
- 不要使用
并在所有package info.java
中写入@xmlmelements
名称空间
package info.java
可以提供一个“默认”名称空间,如果它们不提供名称空间,则该名称空间将用于“限定”元素(由@xmlement
、@xmlementwrapper
、@xmlementrefs
定义)。但您也可以显式地提供名称空间
:
@XmlElement(name="TrafficHistoryResult",
namespace="http://awis.amazonaws.com/doc/2005-07-11")
假设
所有模型类都在同一个包中
原始答案
您应该将包级别@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;
结果
由于TrafficHistoryResponse
元素是唯一具有不同名称空间的元素,请使用@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
谢谢你的回答。我试过了,但我的反应是
无效的有什么建议吗
当我进行上述两项更改并运行以下代码时:
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
属性上应该有@xmlementwrapper(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;
}
}
我无法更改名称空间,因为xml是webservice响应。我尝试了@xmlement(name=“TrafficHistoryResult”,名称空间="我仍然得到空结果。我理解。再次检查我的答案。您尝试了错误的URI,请尝试http://awis.amazonaws.com/doc/2005-07-11
。最后要小心使用/
。其中一个名称空间有它,另一个没有。如果我像你说的那样将名称空间更改为/2005-07-11,我就不会出现异常。javax.xml.bind.UnmarshaleException:意外元素(uri:,本地:“TrafficHistoryResponse”)。预期的元素是@user755806。您在错误的@xmlement
上更改了它。您能给我示例代码在哪里进行更改吗?谢谢您的回答。我尝试了此操作,但响应为空。有什么建议吗?@user755806-我声明的更改对我有效。我已更新了我的答案,以包含我使用的演示代码.
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
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;
}
}
<?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>