java - JAXB - 未编码的字段为空

标签 java xml jaxb

我们正在解码来自 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>

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 完成的,该 Node 从更大的 Document 中提取,在 any 项目列表中。然而,当我们解析 xml 时,CoSearchItem 中的所有字段都设置为 null,无法找出原因。

最佳答案

您需要使用包级 @XmlSchema 注释来指定模型的 namespace 限定。

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

这指定您不需要在 NameSearch 类的 @XmlRootElement@XmlType 上指定命名空间 URI。

了解更多信息


The unmarshaling is done from the first Node extracted from a larger Document, inside an any list of items.

确保用于创建节点的 DOM 解析器是命名空间感知的。

documentBuilderFactory.setNamespaceAware(true);

关于java - JAXB - 未编码的字段为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15085648/

相关文章:

java - Java 中是否有比 Xalan/Xerces 更快的 XML 解析器

java - 使用 JAXB 将列表包装器转换为列表

java - 将 xml 模式选择元素解码为单独的列表

java - 在 AWS EC2 实例上从 JAVA 运行 Bash 命令

java - 从java中从左到右添加jsp表中的数据

Java Sockets - 挂起从服务器读取数据

java - 如何构造 XSD 以在生成的 JAXB 类中使用原始包装器而不是原始类型?

Java DB SQL 命令多余?

java - JAXB 如何将嵌套的 xml 元素解码到字符串中?

xml - 我如何使用继承(即 xs :extension) in my own xml schema?