java - JAXB XML 解码只看到根元素

标签 java xml namespaces jaxb unmarshalling

我在将相当简单的 XML 文档解码为纯 Java 对象时遇到问题。

这是我的 XML 的样子:

<?xml version="1.0" encoding="UTF-8"?>
<codeSystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 vocab.xsd" xmlns="urn:hl7-org:v3">
     <name>RoleCode</name>
     <desc>Codes voor rollen</desc>
     <code code="SON" codeSystem="2.16.840.1.113883.5.111" displayName="natural sonSon ">
         <originalText>The player of the role is a male offspring of the scoping entity (parent).</originalText>
     </code>
     <code code="DAUC" codeSystem="2.16.840.1.113883.5.111" displayName="Daughter">
           <originalText> The player of the role is a female child (of any type) of scoping entity (parent) </originalText>
     </code>
</codeSystem>

它是一个更大文件的一部分,是用于表示人与人之间关系的 Hl7v3 代码系统的规范。

我为 CodeSystem 和 Code 元素创建了两个 Java 类:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class CodeSystem
{
    private String name;

    private String desc;

    @XmlElement(name = "code")
    private List<Code> codes;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
public class Code
{
    @XmlAttribute
    private String code;

    @XmlAttribute
    private String codeSystem;

    @XmlAttribute
    private String displayName;

    private String originalText;
}

我添加了一个 package-info.java 包含:

@XmlSchema(
    namespace = "urn:hl7-org:v3",  
    elementFormDefault = XmlNsForm.UNQUALIFIED, 
    attributeFormDefault = XmlNsForm.UNQUALIFIED,
    xmlns = { 
        @javax.xml.bind.annotation.XmlNs(prefix = "", namespaceURI = "urn:hl7-org:v3") 
    }
)
package nl.topicuszorg.hl7v3.vocab2enum.model;

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

解码非常简单:

JAXBContext context = JAXBContext.newInstance(CodeSystem.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
CodeSystem codeSystem = (CodeSystem) unmarshaller.unmarshal(new File(args[0]));

然而,这会导致一个空的 CodeSystem 对象。除了根元素之外,没有从 XML 中解析。

我不明白为什么无法识别 name、desc 和 code 元素。它们是否位于与根元素不同的 namespace 中?它们不应该是,因为根元素中的命名空间声明没有前缀。

我错过了什么?

最佳答案

在您的 XML 文档中,您指定了一个默认 namespace 。这意味着任何非前缀元素都将位于该 namespace 中。在下面的片段中,codeSystemname 元素都使用 urn:hl7-org:v3 命名空间进行限定。

<codeSystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 vocab.xsd" xmlns="urn:hl7-org:v3">
     <name>RoleCode</name>
     ...
</codeSystem>

您只需将 @XmlSchema 注释上的 elementFormDefault 属性更改为 XmlNsForm.QUALIFIED。您当前将其作为 XmlNsForm.UNQUALIFIED,这意味着只有全局元素将符合 namespace 限定(对应于您的用例中的 @XmlRootElement

@XmlSchema(
    namespace = "urn:hl7-org:v3",  
    elementFormDefault = XmlNsForm.QUALIFIED, 
    attributeFormDefault = XmlNsForm.UNQUALIFIED,
    xmlns = { 
        @javax.xml.bind.annotation.XmlNs(prefix = "", namespaceURI = "urn:hl7-org:v3") 
    }
)
package nl.topicuszorg.hl7v3.vocab2enum.model;

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

了解更多信息

关于java - JAXB XML 解码只看到根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14315925/

相关文章:

java - 编辑maven的设置文件

java - 应用程序中未显示菜单

c# - 带有命名空间但没有 xmlns 的 XML

c# - 从 xml 文件反序列化数据后绑定(bind)到静态字段 - Windows 应用商店应用程序

Python 函数的 __dict__

ruby-on-rails - 嵌套类中的 Ruby 常量。元编程

java - 无法在 Java 中重新打开 MySQL 连接

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - Intellij 依赖问题 - java.lang.NoClassDefFoundError

Java 使用转换器在 XML header 中生成版本 "1.1"