代码之家  ›  专栏  ›  技术社区  ›  Marc

有没有方法让模式在其结构中使用用户定义的元素?

  •  2
  • Marc  · 技术社区  · 16 年前

    我想知道模式是否可以使用用户定义的元素(来自XML)作为其结构。

    在中,作为一个用户,我可以拥有如下功能:

    <subjectType>
       <name>plane</name>
       <name>bird</name>
    </subjectType>
    <questionType>
       <name>organic</name>
       <name>awesome</name>
    </questionType>
    <subjectInterview subjectType="plane">
       <question questionType="organic">false</question>
       <question questionType="awesome">true</question>
    </subjectInterview>
    <subjectInterview subjectType="bird">
       <question questionType="organic">true</question>
       <question questionType="awesome">false</question>
    </subjectInterview>
    

    所以这个模式应该知道:

    • 主题类型
    • 问题类型
    • 主观主义
    • 问题

    但不是用户定义的子元素。 它将理解元素之间如何相互嵌套并具有其他限制(它将像枚举一样处理用户定义的值,以防止出现错误并防止每个SubjectType出现重复的QuestionType)。

    我如何才能在模式中强制使用这种类型的用户定义内容?

    编辑:如果重要的话,我还计划将用户定义的XML解压缩到Java类。

    谢谢

    1 回复  |  直到 16 年前
        1
  •  0
  •   Marc    16 年前

    好的-发现我必须在模式中使用“key”和“keyref”。

    首先-修改后的XML文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
        <subjectType>
           <subject idref="plane"/>
           <subject idref="bird"/>
        </subjectType>
        <questionType>
            <question idref="organic"/>
            <question idref="awesome"/>
        </questionType>
        <subjectInterview id="plane">
           <question id="organic">false</question>
           <question id="awesome">true</question>
        </subjectInterview>
        <subjectInterview id="bird">
           <question id="organic">true</question>
           <question id="awesome">false</question>
        </subjectInterview>
    </root>
    

    这是模式:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="root">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="subjectType" type="subjectType" maxOccurs="unbounded"/>
                    <xs:element name="questionType" type="questionType" maxOccurs="unbounded"/>
                    <xs:element name="subjectInterview" type="subjectInterview" maxOccurs="unbounded">
                        <xs:key name="questionID">
                            <xs:selector xpath="./question"/>
                            <xs:field xpath="@id"/>
                        </xs:key>
    
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
            <xs:key name="subjectID">
                <xs:selector xpath="./subjectInterview"/>
                <xs:field xpath="@id"/>
            </xs:key>
            <xs:keyref name="subjectIDref" refer="subjectID">
                <xs:selector xpath="./subjectType/subject"/>
                <xs:field xpath="@idref"/>
            </xs:keyref>
    
            <xs:keyref name="questionIDref" refer="questionID">
                <xs:selector xpath="./questionType/question"/>
                <xs:field xpath="@idref"/>
            </xs:keyref>
        </xs:element>
    
        <xs:complexType name="subjectInterview">
            <xs:sequence  maxOccurs="unbounded">
                <xs:element name="question" type="question"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:string"/>
        </xs:complexType>
    
        <xs:complexType name="question">
            <xs:simpleContent>
                <xs:extension base="xs:string">
                    <xs:attribute name="id" type="xs:string"/>
                </xs:extension>
            </xs:simpleContent>
        </xs:complexType>
    
        <xs:complexType name="subjectType">
            <xs:sequence>
                <xs:element name="subject" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="idref" type="xs:string"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    
        <xs:complexType name="questionType">
            <xs:sequence>
                <xs:element name="question" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="idref" type="xs:string"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    
    </xs:schema>
    

    对那些试图做同样事情的人来说应该是一个不错的基础。