代码之家  ›  专栏  ›  技术社区  ›  Olivier Girardot

无法设计XSD架构-因为存在变量元素名

  •  2
  • Olivier Girardot  · 技术社区  · 14 年前

    我并不擅长创建XSD模式,因为这实际上是我的第一个模式, 我想验证一个XML,它必须如下所示:

    <?xml version="1.0"?>
    <Data>
      <FIELD name='toto'>
        <META mono='false' dynamic='false'>
          <COLUMN1>
              <REFTABLE>table</REFTABLE>
              <REFCOLUMN>key_column</REFCOLUMN>
              <REFLABELCOLUMN>test_column</REFLABELCOLUMN>
          </COLUMN1>
          <COLUMN2>
              <REFTABLE>table</REFTABLE>
              <REFCOLUMN>key_column</REFCOLUMN>
              <REFLABELCOLUMN>test_column</REFLABELCOLUMN>
          </COLUMN2>
    </META>
    <VALUEs>
       <VALUE>...</VALUE>
    </VALUEs>
    </FIELD>
    

    我的问题是,进入元块的标签“column1”、“column2”总是不同的,它可能会变成columnxxx。目前我的模式是:

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="Data">
        <xsd:complexType>
       <xsd:sequence>
         <xsd:element name="FIELD" type="Field" />
        </xsd:sequence>
          <xsd:attribute name="id" type="xsd:int" use="required" />
        </xsd:complexType>
    </xsd:element>
    
    <xsd:complexType name="dataSourceDef">
        <xsd:sequence>
            <xsd:element name="DSD_REFTABLE" type="xsd:string" />
            <xsd:element name="DSD_REFCOLUMN" type="xsd:string" />
            <xsd:element name="DSD_REFLABELCOLUMN" type="xsd:string" />
        </xsd:sequence>
    </xsd:complexType>
    
    <xsd:complexType name="MetaTag">
        <xsd:sequence>
            <xsd:any processContents="lax" />
        </xsd:sequence>
        <xsd:attribute name="mono" type="xsd:string" use="required" />
        <xsd:attribute name="dynamic" type="xsd:string" use="required"/>
    </xsd:complexType>
    
    <xsd:complexType name="Field">
        <xsd:sequence>
            <xsd:element name="META" type="MetaTag" minOccurs="1" />
            <xsd:element name="VALUEs">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:any processContents="lax" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="name" type="xsd:string" use="required"/>
    </xsd:complexType>
    </xsd:schema>
    

    我就是不能让它工作,我不知道如何处理这样一个事实:我的节点的精确级别不清楚,其余的都不清楚。

    你能帮我吗?

    2 回复  |  直到 10 年前
        1
  •  0
  •   Ghislain Fourny    14 年前

    我认为问题在于,在你的模式中, <xsd:any/> 只接受一个元素。您需要告诉您,可以有任意数量的具有这些属性的子级 极小发生 最大发生 :

    <xsd:sequence>
        <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
    
        2
  •  3
  •   John Saunders    14 年前

    不能有这样的文档并根据XML架构进行验证。使用

    <COLUMN name="Column1"/>
    

    相反。