【问题标题】:XML element not validated using XSD未使用 XSD 验证 XML 元素
【发布时间】:2018-07-04 11:04:23
【问题描述】:

我在通过 XSD 模式进行 XML 验证方面遇到问题。 假设我有以下结构:

<?xml version="1.0" encoding="utf-8"?>
  <Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Category1>
      <Elementb>a</Elementb>
      <Element2>1</Element2>
      <Element3>1.0</Element3>
    </Category1>
    <Category2>
      <Element4>b</Element4>
      <Element5>c</Element5>
    </Category2>
 </Root>

还有以下架构:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified">
  <xs:element name="Root">
    <xs:complexType>
      <xs:all>
        <xs:element name="Category1" type="category1Type" minOccurs="0"/>
        <xs:element name="Category2" type="category2Type" minOccurs="0"/>
      </xs:all>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="category1Type">
    <xs:all>
      <xs:element name="Element1" type="xs:token" minOccurs="0"/>
      <xs:element name="Element2" type="xs:integer" minOccurs="0"/>
      <xs:element name="Element3" type="xs:decimal" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
  <xs:complexType name="category2Type">
    <xs:all>
      <xs:element name="Element4" type="xs:token" minOccurs="0"/>
      <xs:element name="Element5" type="xs:token" minOccurs="0"/>
    </xs:all>
  </xs:complexType>
</xs:schema>

好的,“Elementb”未验证,因为它未在架构中定义。这是故意的。 假设我们使用以下代码进行验证:

foreach (XmlNode rootNode in document)
{
  foreach (XmlNode category in rootNode)
  {
    foreach (XmlElement element in category)
    {
      document.Validate(ValidationCallBack, element);
    }
  }
}

意思是我希望逐个元素地进行验证。问题在于,在这种情况下,不仅&lt;Elementb&gt; 在调用 Validate 时会引发异常,而且该类别中的以下元素也会引发异常。这是为什么?我错过了什么?我认为通过使用xs:allminOccurs="0",顺序并不重要,并且由于缺少&lt;Element1&gt;&lt;Element2&gt; 也应该验证。有任何想法吗?谢谢。

【问题讨论】:

    标签: xml xsd xsd-validation


    【解决方案1】:

    我认为是因为您只是要求它验证

     <Element2>1</Element2>
    

    它没有元素2在文档中的上下文,所以它把它当作根元素。这对 XML 架构无效,因为定义的唯一根元素是“根”。

    您也许可以将架构更改为如下所示,但从根验证文档并在验证处理程序中处理结果更为正常

    <?xml version="1.0" encoding="utf-8" ?>
    <!--Created with Liquid Studio 2018 (https://www.liquid-technologies.com)-->
    <xs:schema elementFormDefault="unqualified"
               xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="Root">
            <xs:complexType>
                <xs:all>
                    <xs:element name="Category1"
                                type="category1Type"
                                minOccurs="0" />
                    <xs:element name="Category2"
                                type="category2Type"
                                minOccurs="0" />
                </xs:all>
            </xs:complexType>
        </xs:element>
        <xs:complexType name="category1Type">
            <xs:all>
                <xs:element ref="Element1"
                            minOccurs="0" />
                <xs:element ref="Element2"
                            minOccurs="0" />
                <xs:element ref="Element3"
                            minOccurs="0" />
            </xs:all>
        </xs:complexType>
        <xs:complexType name="category2Type">
            <xs:all>
                <xs:element ref="Element4"
                            minOccurs="0" />
                <xs:element ref="Element5"
                            minOccurs="0" />
            </xs:all>
        </xs:complexType>
        <xs:element name="Element1"
                    type="xs:token" />
        <xs:element name="Element2"
                    type="xs:integer" />
        <xs:element name="Element3"
                    type="xs:decimal" />
        <xs:element name="Element4"
                    type="xs:token" />
        <xs:element name="Element5"
                    type="xs:token" />
    </xs:schema>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 2017-09-09
      • 1970-01-01
      • 2016-11-15
      • 2019-01-08
      • 2020-02-26
      相关资源
      最近更新 更多