jaxb xjcコンパイラxmlスキーマドキュメントでmixed = trueを無視する
質問
XJCは完全に無視しているようです mixed="true"
私のXMLスキーマ要素では、テキストコンテンツを抽出することができません。以下のサンプルXMLから、「タイトルテキスト」を抽出できる必要があります。それなし mixed="true"
認識されているため、XMLからのアクセサーは作成されておらず、XMLから監視されていません。
<?xml version="1.0" encoding="UTF-8"?>
<title xmlns="urn:hl7-org:v3" integrityCheck="true">Title Text</title>
問題を示す完全なが最小化されたスキーマは次のとおりです。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema targetNamespace="urn:hl7-org:v3"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="urn:hl7-org:v3"
xmlns:mif="urn:hl7-org:v3/mif"
elementFormDefault="qualified">
<xs:complexType name="ST" mixed="true">
<xs:complexContent>
<xs:restriction base="ED">
<xs:sequence>
<xs:element name="reference" type="xs:string" minOccurs="0" maxOccurs="0"/>
<xs:element name="thumbnail" type="xs:string" minOccurs="0" maxOccurs="0"/>
</xs:sequence>
<xs:attribute name="compression" type="xs:string" use="prohibited"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ED" mixed="true">
<xs:complexContent>
<xs:extension base="BIN">
<xs:sequence>
<xs:element name="reference" type="xs:string" minOccurs="0" maxOccurs="1" />
<xs:element name="thumbnail" minOccurs="0" maxOccurs="1" type="xs:string" />
</xs:sequence>
<xs:attribute name="compression" type="xs:string" use="optional" />
<xs:attribute name="integrityCheck" type="xs:string" use="optional" />
<xs:attribute name="integrityCheckAlgorithm" type="xs:string" use="optional" default="SHA-1" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="BIN" abstract="true" mixed="true">
<xs:complexContent>
<xs:extension base="ANY">
<xs:attribute name="representation" use="optional" type="xs:string" default="TXT" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ANY" abstract="true">
<xs:attribute name="nullFlavor" type="xs:string" use="optional" />
</xs:complexType>
<xs:element name="title" type="ST" />
</xs:schema>
上記では、混合= "true"があることに注意してください。それにもかかわらず、生成されたスキーマフラグメントにはそれへの参照が含まれておらず、生成されたクラスは XmlMixed
注釈も、値やコンテンツアクセター:
/**
* <p>Java class for ST complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="ST">
* <complexContent>
* <restriction base="{urn:hl7-org:v3}ED">
* <sequence>
* <element name="reference" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="0" minOccurs="0"/>
* <element name="thumbnail" type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="0" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ST")
public class ST
extends ED
{
}
XJC / JaxBが私の混合コンテンツフィールドを完全に無視しているのはなぜですか? JAXB 2.1とJAXB 2.2の両方を試しましたが、生成されたコードには些細な違いのみが存在します。
ノート: :実際のスキーマは標準に準拠したヘルスケア(HL7)スキーマであるため、スキーマを変更することはできません。
解決
もっと研究の後、私はそれが私が提出したバグだと結論付けることしかできませんでした。それはとして認められました Jaxb Issue#792.
他のヒント
http://blogs.oracle.com/mgrebac/entry/handling_extended_mixed_content_in
これはうまくいきました!次のようなバインディングファイルを作成するだけです:
<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc">
<jaxb:globalBindings generateMixedExtensions="true"/>
</jaxb:bindings>
次に、コマンドラインの-bパラメーターを使用して、通常のやり方で使用します。
年が経ちましたが、このスキームは人々を悩ませ続けます!過去数日間、特に混合コンテンツ要素タイプを処理するために、この同じXSD(HL7)に苦労してきました。
私の最初の要件は、混合要素の中に簡単なテキストを書く必要があったため、元のポスターの反対でした。しかし、私はそのようなコンテンツも読むことができなければならないので、別の返信で提案されたのと同じソリューションを適用しました。それはカスタムバインディングファイルを作成し、Eclipseの「SchemaのJaxbクラス」ウィザードでそれを使用しています。その場合、ウィザードのダイアログのいずれかで使用するバインディングファイルを具体的に選択できます。
その結果、クラスはaで生成されます List<Serializable>
混合要素タイプが見つかったときはいつでもコンテンツ。実際に必要な情報を抽出するのは少し難しくなりますが、少なくとも、XSDを順守するXMLファイルに存在するものをプログラム的にアクセスできると確信しています。
次のようなより複雑な混合コンテンツに移動することもできます。
<v3:name>
<v3:given>Sample Given Name</v3:given>
<v3:family>Sample Family Name</v3:family>
</v3:name>
どこ name
そのように定義されています(元のXSDからこの例には役に立たないコンテンツを削除しました):
<xs:complexType name="EN" mixed="true">
<xs:complexContent>
<xs:sequence>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="delimiter" type="en.delimiter"/>
<xs:element name="family" type="en.family"/>
<xs:element name="given" type="en.given"/>
<xs:element name="prefix" type="en.prefix"/>
<xs:element name="suffix" type="en.suffix"/>
</xs:choice>
</xs:sequence>
</xs:complexContent>
</xs:complexType>
タイプ en.family
, en.given
そして、それはそれ自体が混ざり合っています(そして、私たちの目的のために、私たちは他に何も知る必要はありません)。
したがって、名前のコンテンツにアクセスすると、 List<Serializable>
で構成されます:
- a
String
, 、間の空白であること<v3:name>
と<v3:given>
- an
EnGiven
エレメント - a
String
, 、間の空白であること</v3:given>
と<v3:family>
- an
EnFamily
エレメント - a
String
, 、間の空白であること</v3:family>
と</v3:name>
EnGiven
と EnFamily
のコンテンツはそれぞれシングルでできています String
, 、それぞれ「名前が付けられたサンプル」と「サンプル姓」。繰り返しますが、それは少し難しいです、そしてあなたはおそらく特定のケースを処理するためにいくつかのロジックを置く必要がありますが、あなたはそれをこのように管理することができます。
ちなみに、要素の居住は些細なことです。目的に文字列を追加するだけです List<Serializable>
コンテンツ。