ver*_*age 4 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>
Run Code Online (Sandbox Code Playgroud)
它是更大文件的一部分,是用于表示人与人之间关系的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;
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个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;
Run Code Online (Sandbox Code Playgroud)
解组是非常简单的:
JAXBContext context = JAXBContext.newInstance(CodeSystem.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
CodeSystem codeSystem = (CodeSystem) unmarshaller.unmarshal(new File(args[0]));
Run Code Online (Sandbox Code Playgroud)
但是这会导致一个空的CodeSystem对象.除了根元素之外,没有任何内容从XML中解析出来.
我无法弄清楚为什么名称,desc和代码元素无法识别.它们是否位于与根元素不同的命名空间中?它们不应该是,因为根元素中的名称空间声明没有前缀.
我错过了什么?
在XML文档中,您指定了一个默认命名空间.这意味着任何非前缀元素都将位于该命名空间中.在下面的片段中,codeSystem和name元素都使用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>
Run Code Online (Sandbox Code Playgroud)
您只需要将注释的elementFormDefault属性更改@XmlSchema为XmlNsForm.QUALIFIED.您目前拥有它,XmlNsForm.UNQUALIFIED这意味着只有全局元素将被命名空间限定(@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;
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息
| 归档时间: |
|
| 查看次数: |
6868 次 |
| 最近记录: |