Java JAXB-解组字段为空

Java JAXB-解组字段为空,java,xml,jaxb,Java,Xml,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

我们正在解密来自的响应。这是发送给马歇尔的文本:

<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>
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

}

任何
项目列表中较大的
文档
提取的第一个
节点
执行解组。但是,当我们解析xml时,CoSearchItem中的所有字段都设置为null,并且无法找出原因。

您需要使用包级别的
@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
类上指定命名空间URI

了解更多信息


解组是从从较大的节点中提取的第一个节点执行的 文档,在任何项目列表中

确保用于创建节点的domparer支持名称空间

documentBuilderFactory.setNamespaceAware(true);

多亏了@,我找到了正确的答案。查看包名称空间限定后,我发现它指向:

"http://xmlgw.companieshouse.gov.uk/v1-0"
"http://xmlgw.companieshouse.gov.uk/v1-0/schema"
它应该指向:

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

不确定这是怎么错的。

我通过在生成存根之前在xsd中设置
elementFormDefault=“unqualified”
解决了这个问题,否则在包信息中手动进行更改。java

有帮助吗?它像Blaise一样指向@XmlSchema,有点像。我在意识到不正确的名称空间限定后发现了这个问题。感谢您向我指出包架构注释:),结果证明它不是正确的。java在1.8.0_100中有一个变化,这使得这个答案成为为所有字段设置架构的唯一正确方法。在那个版本之前,@XmlRootElement也可以工作,这样就可以了。发生的情况是,JAXB认为每个
@xmlement
注释都位于错误的名称空间中,因此它们在反序列化时不匹配,因此数据被丢弃在地板上。(默认情况下,JAXB忽略未知元素。)