代码之家  ›  专栏  ›  技术社区  ›  David Basarab

什么xsd会让一个元素将自己无限地作为一个子元素?

  •  9
  • David Basarab  · 技术社区  · 15 年前

    <?xml version="1.0" encoding="utf-8" ?>
    <SampleXml>
        <Items>
            <Item name="SomeName" type="string">
                This would be the value
            </Item>
            <Item name="SecondName" type="string">
                This is the next string
            </Item>
            <Item name="AnotherName" type="list">
                <Items>
                    <Item name="SubName" type="string">
                        A string in a sub list
                    </Item>
                    <Item name="SubSubName" type="list">
                        <Items>
                            <Item name="HowDoI" type="string">
                                How do I keep this going infinately?
                            </Item>
                        </Items>
                    </Item>
                </Items>
            </Item>
        </Items>
    </SampleXml>
    

    我找到的唯一解决办法就是在xsd中重复我愿意复制的次数。就像下面一样。

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="SampleXml">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="Items">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element maxOccurs="unbounded" name="Item">
                                    <xs:complexType mixed="true">
                                        <xs:sequence minOccurs="0">
                                            <xs:element name="Items">
                                                <xs:complexType>
                                                    <xs:sequence>
                                                        <xs:element maxOccurs="unbounded" name="Item">
                                                            <xs:complexType mixed="true">
                                                                <xs:sequence minOccurs="0">
                                                                    <xs:element name="Items">
                                                                        <xs:complexType>
                                                                            <xs:sequence>
                                                                                <xs:element name="Item">
                                                                                    <xs:complexType>
                                                                                        <xs:simpleContent>
                                                                                            <xs:extension base="xs:string">
                                                                                                <xs:attribute name="name" type="xs:string" use="required" />
                                                                                                <xs:attribute name="type" type="xs:string" use="required" />
                                                                                            </xs:extension>
                                                                                        </xs:simpleContent>
                                                                                    </xs:complexType>
                                                                                </xs:element>
                                                                            </xs:sequence>
                                                                        </xs:complexType>
                                                                    </xs:element>
                                                                </xs:sequence>
                                                                <xs:attribute name="name" type="xs:string" use="required" />
                                                                <xs:attribute name="type" type="xs:string" use="required" />
                                                            </xs:complexType>
                                                        </xs:element>
                                                    </xs:sequence>
                                                </xs:complexType>
                                            </xs:element>
                                        </xs:sequence>
                                        <xs:attribute name="name" type="xs:string" use="required" />
                                        <xs:attribute name="type" type="xs:string" use="required" />
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>
    
    3 回复  |  直到 15 年前
        1
  •  15
  •   Joren    15 年前

    使用 <xs:element ref="bla" /> 递归地引用元素。 一个简单的例子:

    <xs:element name="recursive">
      <xs:complexType>
        <xs:sequence>
          <xs:element ref="recursive" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
      </xs:complexType>
    </xs:element>
    

    允许您编写以下内容:

    <recursive>
      <recursive>
        <recursive />
      </recursive>
      <recursive />
      <recursive>
        <recursive>
          <recursive />
        </recursive>
      </recursive>
    </recursive>
    

    “ref”属性的使用还有助于极大地提高XSD的可读性。我会这样写你的:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:element name="SampleXml">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="Items" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <xs:element name="Items">
        <xs:complexType>
          <xs:sequence>
            <xs:element ref="Item" maxOccurs="unbounded" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    
      <xs:element name="Item">
        <xs:complexType mixed="true">
          <xs:sequence>
            <xs:element ref="Items" minOccurs="0" />
          </xs:sequence>
          <xs:attribute name="name" type="xs:string" use="required" />
          <xs:attribute name="type" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
    
    </xs:schema>
    

    请注意,“ref”的使用,即使在没有严格必要的情况下(例如SampleXml引用项时),也会减少XSD的嵌套混乱,提高可读性。

        2
  •  5
  •   Julien Lebosquain    15 年前

    试试这样,用 ref

    <xs:element name="Items">
      <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
          <xs:element ref="Item" />
        </xs:sequence> 
      </xd:complexType
     </xd:element>
    
    <xs:element name="Item">
      <xs:complexType>
        <xs:sequence>
          <xs:element ref="Items" />
        </xs:sequence> 
      </xd:complexType
     </xd:element>
    
        3
  •  5
  •   Eric    15 年前

    尝试使用 ref

    <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="Items">
            <xs:complexType>
                <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="Item">
                        <xs:complexType mixed="true">
                            <xs:sequence minOccurs="0">
                                <xs:element ref="Items" />
                            </xs:sequence>
                            <xs:attribute name="name" type="xs:string" use="required" />
                            <xs:attribute name="type" type="xs:string" use="required" />
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="SampleXml">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="Items" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>