【问题标题】:JAXB XJC compiler disregarding mixed=true on XML Schema documentsJAXB XJC 编译器忽略 XML Schema 文档上的混合=真
【发布时间】:2011-05-02 05:37:30
【问题描述】:

XJC 似乎完全忽略了我的 XML Schema 元素上的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) 架构。

【问题讨论】:

  • BIN 类是什么样的?
  • @Blaise - 我现在包含了一个小而完整的架构来演示该问题。
  • 曾经找到解决这个问题的方法吗?我面临同样的问题。我不得不编辑生成的类 (BIN)。
  • 我最终提交了一份错误报告,我将在答案中链接到该报告。

标签: xml jaxb xjc mixed


【解决方案1】:

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 参数。

【讨论】:

  • 我记得当时看过那篇文章,IIRC,我的问题虽然相关,但略有不同。但是……我已经记不太清了。
  • 它确实创建了一个内容字段,不幸的是它是一个丑陋的 List,但这总比没有它要好,特别是因为我也在使用 HL7 模式。事实上,这与我遇到问题的课程相同。
【解决方案2】:

经过更多研究,我只能得出结论,这是我提交的一个错误。它被确认为JAXB issue #792。

【讨论】:

    【解决方案3】:

    多年过去了,但这个计划一直困扰着人们!在过去的几天里,我一直在为同样的 XSD (HL7) 苦苦挣扎,尤其是在处理混合内容元素类型方面。

    我最初的要求与原始海报相反,因为我需要在混合元素中编写简单的文本。但我也必须能够阅读这些内容,所以我应用了另一个回复中建议的相同解决方案,即创建一个自定义绑定文件并在 Eclipse 的“来自模式的 JAXB 类”向导中使用它。 在这种情况下,您可以专门选择在向导的对话框之一中使用哪个绑定文件。

    因此,只要找到混合元素类型,就会生成带有List&lt;Serializable&gt; 内容的类。提取您实际需要的单条信息有点棘手,但至少您确定可以以编程方式访问遵循 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&lt;Serializable&gt; 将由:

    1. String,是&lt;v3:name&gt; 和&lt;v3:given&gt; 之间的空白
    2. EnGiven 元素
    3. String,是&lt;/v3:given&gt; 和&lt;v3:family&gt; 之间的空白
    4. EnFamily 元素
    5. String,是&lt;/v3:family&gt; 和&lt;/v3:name&gt; 之间的空白

    EnGiven 和EnFamily 的内容将分别由单个String 组成,分别为“示例名字”和“示例姓氏”。同样,这有点棘手,您可能必须放置一些逻辑来处理特定情况,但您可以通过这种方式进行管理。

    顺便说一句,填充元素很简单:只需将字符串添加到所需的List&lt;Serializable&gt; 内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多