2013-02-26 47 views
4

我们正在编组来自http://xmlgw.companieshouse.gov.uk/的响应。这是发送到马歇尔文字:JAXB - 未编组字段为空

<NameSearch xmlns="http://xmlgw.companieshouse.gov.uk/v1-0/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-0/schema http://xmlgw.companieshouse.gov.uk/v1-0/schema/NameSearch.xsd"> 
    <ContinuationKey>...</ContinuationKey> 
    <RegressionKey>...</RegressionKey> 
    <SearchRows>20</SearchRows> 
    <CoSearchItem> 
    <CompanyName>COMPANY NAME</CompanyName> 
    <CompanyNumber>23546457</CompanyNumber> 
    <DataSet>LIVE</DataSet> 
    <CompanyIndexStatus>DISSOLVED</CompanyIndexStatus> 
    <CompanyDate></CompanyDate> 
    </CoSearchItem> 
    // more CoSearchItem elements 
</NameSearch> 

CoSearchItem的模式是这样的:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "CoSearchItem", propOrder = { 
    "companyName", 
    "companyNumber", 
    "dataSet", 
    "companyIndexStatus", 
    "companyDate", 
    "searchMatch" 
}) 
public class CoSearchItem { 

    @XmlElement(name = "CompanyName", required = true) 
    protected String companyName; 
    @XmlElement(name = "CompanyNumber", required = true) 
    protected String companyNumber; 
    @XmlElement(name = "DataSet", required = true) 
    protected String dataSet; 
    @XmlElement(name = "CompanyIndexStatus") 
    protected String companyIndexStatus; 
    @XmlElement(name = "CompanyDate") 
    @XmlSchemaType(name = "date") 
    protected XMLGregorianCalendar companyDate; 
    @XmlElement(name = "SearchMatch") 
    protected String searchMatch; 

    // getters and setters 

} 

NameSearch模型具有这样的结构:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "NameSearch", namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema", propOrder = { 
    "continuationKey", 
    "regressionKey", 
    "searchRows", 
    "coSearchItem" 
}) 
@XmlRootElement(name = "NameSearch", namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema") 
public class NameSearch { 

    @XmlElement(name = "ContinuationKey", required = true) 
    protected String continuationKey; 
    @XmlElement(name = "RegressionKey", required = true) 
    protected String regressionKey; 
    @XmlElement(name = "SearchRows", required = true) 
    protected BigInteger searchRows; 
    @XmlElement(name = "CoSearchItem") 
    protected List<CoSearchItem> coSearchItem; 

    // setters and getters 

} 

包装上有这样的注释:

@XmlSchema(namespace = "http://xmlgw.companieshouse.gov.uk/v1-0", elementFormDefault = XmlNsForm.QUALIFIED, // 
    xmlns = { 
     @XmlNs(prefix = "xsi", namespaceURI = "http://www.w3.org/2001/XMLSchema-instance") 
    } 
) 

package uk.gov.companieshouse; 

解组是从第一个Node中提取的,从大的Document中提取,在any项目列表中。但是,当我们解析xml时,CoSearchItem中的所有字段都设置为null,并且无法找出原因。

+1

does [this](http://stackoverflow.com/questions/12747484/jaxb-parses-xml-child-into-null-only-the-attributes-are-set-in-the-object)有帮助吗? – TheWhiteRabbit 2013-02-26 09:52:50

+0

它指向像Blaise这样的@XmlSchema,就是这样。在发现不正确的命名空间限定后,我发现了这个问题。 – pablisco 2013-02-26 10:13:44

回答

13

您需要使用包级别@XmlSchema注释来指定模型的名称空间限定。

@XmlSchema(
    namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema", 
    elementFormDefault = XmlNsForm.QUALIFIED) 
package example; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

这本规定的,你不需要对@XmlRootElement@XmlType指定在NameSearch类的命名空间URI。

更多信息


解组是从较大 文献中提取的第一节点完成,内部项目的任何列表。

确保用于创建节点的DOM parer具有名称空间感知功能。

documentBuilderFactory.setNamespaceAware(true); 
+1

感谢您指点我的包模式注释:)事实证明,这不是正确的。 – pablisco 2013-02-26 10:11:57

+3

在1.8.0_100左右的Java中发生了一个变化,这个答案是为所有字段设置模式的唯一正确方法。在该版本之前@XmlRootElement也在工作。 – Sankozi 2016-12-19 10:13:20

2

由于@Blaise Doughan,我找到了正确的答案。看包的命名空间的资格后,我发现它是指向:

"http://xmlgw.companieshouse.gov.uk/v1-0" 

,它应该已经指向:

"http://xmlgw.companieshouse.gov.uk/v1-0/schema" 

不知道如何得到错误的。

+1

这将做到这一点。发生的事情是,JAXB认为每个'@ XmlElement'注释都在错误的名称空间中,所以在反序列化时它们不匹配,所以数据在地面上丢失。 (JAXB默认忽略未知元素。) – 2013-02-26 10:26:05