5

かなり単純な 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 要素用に 2 つの 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 要素が認識されない理由がわかりません。それらはルート要素とは異なる名前空間に存在しますか? ルート要素の名前空間宣言は接頭辞が付いていないため、そうすべきではありません。

私は何が欠けていますか?

4

1 に答える 1

9

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>

注釈のelementFormDefaultプロパティを に変更するだけです。現在、グローバル要素のみが名前空間で修飾されることを意味します(ユースケースに対応するもの)。@XmlSchemaXmlNsForm.QUALIFIEDXmlNsForm.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;

詳細については

于 2013-01-14T10:31:58.897 に答える