XJC 似乎完全忽略了我的 XML 架构元素上的
mixed="true"
,因此不允许我提取文本内容。我需要能够从下面的示例 XML 中提取“标题文本”。如果不识别 mixed="true"
,则不会创建任何访问器,也不会从 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) 架构。
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 参数。
经过更多研究,我无能为力,只能得出结论,这是我提交的一个错误。它被确认为 JAXB 问题 #792。
年复一年,这个计划却一直困扰着人们!在过去的几天里,我一直在努力解决同样的 XSD (HL7),特别是在处理混合内容元素类型方面。
我最初的要求与原始海报相反,因为我需要在混合元素内编写简单的文本。但我也必须能够阅读此类内容,因此我应用了另一个回复中建议的相同解决方案,即创建一个自定义绑定文件并在 Eclipse 的“来自架构的 JAXB 类”向导中使用它。 在这种情况下,您可以在向导的对话框之一中专门选择要使用的绑定文件。
因此,只要找到混合元素类型,就会生成具有
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
等本身是混合的(出于我们的目的,我们不需要知道其他任何东西)。
因此,当您访问 name 的内容时,其
List<Serializable>
将由以下内容组成:
String
,即 <v3:name>
和 <v3:given>
EnGiven
元素String
,即 </v3:given>
和 <v3:family>
EnFamily
元素String
,即 </v3:family>
和 </v3:name>
EnGiven
和 EnFamily
的内容将分别由单个 String
组成,分别为“示例名字”和“示例姓氏”。同样,这有点棘手,您可能必须添加一些逻辑来处理特定情况,但您可以通过这种方式进行管理。
顺便说一句,填充元素很简单:只需将一个字符串添加到所需的
List<Serializable>
内容即可。