代码之家  ›  专栏  ›  技术社区  ›  Kaleb Pederson

JAXB XJC编译器忽略XML模式文档上的mixed=true

  •  9
  • Kaleb Pederson  · 技术社区  · 15 年前

    mixed="true" 因此不允许我提取文本内容。从下面的示例XML中,我需要能够提取“Title Text” 如果被识别,则不会创建访问器,也不会从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和jaxb2.2,但是生成的代码中只存在一些细微的差异。

    注意

    3 回复  |  直到 15 年前
        1
  •  6
  •   herry    12 年前

    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参数,使用通常的方式。

        2
  •  5
  •   Kaleb Pederson    14 年前
        3
  •  4
  •   NikeXTC    8 年前

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

    List<Serializable> 每当找到混合元素类型时的内容。提取您实际需要的单个信息有点困难,但至少您确信可以通过编程访问遵循XSD的XML文件中的任何内容。

    您甚至可以导航到更复杂的混合内容,如:

    <v3:name>
        <v3:given>Sample Given Name</v3:given>
        <v3:family>Sample Family Name</v3:family>
    </v3:name>
    

    在哪里? name

    <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的内容时 列表<可序列化>

    1. String <v3:name> <v3:given>
    2. 一个 EnGiven 要素
    3. 字符串 之间的空白 </v3:given> <v3:family>
    4. 一个 EnFamily 要素
    5. 字符串 </v3:family> </v3:name>

    活泼的 的内容将由单个 ,分别为“样本名”和“样本族名”。再说一次,这有点棘手,您可能需要放置一些逻辑来处理特定的情况,但您可以这样管理它。

    顺便说一下,填充一个元素是很简单的:只需向所需的 内容。