xml元素,未知名称,但已知它没有复杂类型

时间:2015-12-04 11:58:07

标签: xml xsd xsd-validation

所以我试图验证一个看起来像这样的xml:

<module name="example" alias="ex1">
<params>
    <p1>1</p1>
    <pcomplex>
        <p>2</p>
    </pcomplex>
    <foo>2</foo>
    <bar>3</bar>
    .....
    <pn>this is the n'th element</pn>
</params>

pcomplex块应该抛出错误,因为我不想允许任何complexTye内部参数序列

我试过这个xsd:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="module">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="params" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:any processContents="lax" minOccurs="0"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute type="xs:string" name="name" use="required"/>
      <xs:attribute type="xs:string" name="alias" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

但它在我试图做的事情上失败了。

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

这在XSD 1.0中无法完成。但是,XSD 1.1可以很容易地处理这种情况。下面是一个可能的方法:@test正在检查具有嵌套元素的元素。

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
    <xsd:element name="module">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="params">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>                            
                        </xsd:sequence>
                        <xsd:assert test="not(*[*|@*])"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="alias" type="xsd:string" use="required"/>
            <xsd:attribute name="name" type="xsd:string" use="required"/>
        </xsd:complexType>
    </xsd:element>  
</xsd:schema>

如果您想允许具有简单内容的复杂类型(即没有嵌套元素,允许属性),那么只需将测试更改为not(*[*])

无效的XML可能会产生这种情况(基于以上架构):

  

cvc-assertion.3.13.4.1:对于元素&#39; params&#39;的断言评估(&#39; not(* [* | @ *])&#39;)类型&#39; #anonymous&#39;没有成功。