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

复杂XML结构的XSD

  •  1
  • vonludi  · 技术社区  · 7 年前

    我正在尝试验证一个相当复杂的XML结构,但我似乎无法提出一个XSD结构来表达以下内容:

    <foo fooAttribute1="..." fooAttribute2="..." ...>
      <bar1 id="1" ... />
      <bar1 id="2" ... />
      <bar2 id="1" ... />
      <bar2 id="2" ... />
      <![MyFormattedTextGoesHere[foo text goes here]]>
    </foo>
    

    所以,我想要一个 foo 可以

    • 0..* bar1 元素
    • 0..* bar2 元素
    • 文本(例如,以开头 <![MyFormattedTextGoesHere[ ]]>

    另一个相关注意事项是:我还可以验证属性吗 价值观 像这样: <xml someAttribute=$... /> (必须从 $ )?

    我现在拥有的是

    <xs:element name="foo" minOccurs="0" maxOccurs="unbounded">
      <xs:complexType mixed="true">
        <xs:sequence>
          <xs:element name="bar1" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
              <xs:attribute name="id" form="unqualified" type="xs:string" />
              <xs:attribute name="..." form="unqualified" type="xs:string" />
            </xs:complexType>
          </xs:element>
          <xs:element name="bar2" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
              <xs:attribute name="id" form="unqualified" type="xs:string" />
              <xs:attribute name="..." form="unqualified" type="xs:string" />
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="fooAttribute1" form="unqualified" type="xs:string"/>
        <xs:attribute name="fooAttribute2" form="unqualified" type="xs:string"/>
        <xs:attribute name="..." form="unqualified" type="xs:string" />
        <!-- accept/validate text here? -->
      </xs:complexType>
      <!-- or here? -->
    </xs:element>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Ghislain Fourny    7 年前

    由于以下原因,上面的XML格式不正确 <!

    <?xml version="1.0" encoding="UTF-8"?>
    <foo fooAttribute1="$..." fooAttribute2="..." >
       <bar1 id="1" />
       <bar1 id="2" />
       <bar2 id="1" />
       <bar2 id="2" />
       <![CDATA[MyFormattedTextGoesHere[foo text goes here]]>
    </foo>
    

    对于上述XML有效的模式,一个良好的起点是:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
        <xs:simpleType name="beginswithdollar">
            <xs:restriction base="xs:string">
                <xs:pattern value="\$.*"/>
            </xs:restriction>
        </xs:simpleType>
        <xs:element name="foo">
            <xs:complexType mixed="true">
                <xs:sequence>
                    <xs:element name="bar1" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:sequence/>
                            <xs:attribute name="id" type="xs:string"/>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="bar2"  minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:sequence/>
                            <xs:attribute name="id" type="xs:string"/>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="fooAttribute1" type="beginswithdollar"/>
                <xs:anyAttribute processContents="lax"/>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    

    但XML模式不支持以下几点:

    • XML模式看不到文本是否位于CDATA节中。CDATA节用于避免转义特殊字符。
    • bar* 元素。
    • xs:anyAttribute fooAttribute1 必须以美元开头,而任何其他属性都不受限制。

    如果支持XML模式1.1,那么还有 assert 允许表达用户定义约束的功能。这可能是一种以定制方式进一步限制实例有效性的方法,超越了其他XML模式组件的功能。