C# xml validation

本文关键字:validation xml | 更新日期: 2023-09-27 17:59:42

我定义了xsd:
与HTML表非常相似。行有列,列有元素。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:attributeGroup name="basics">
    <xs:attribute name="title" type="xs:string" use="required"/>
    <xs:attribute name="field_id" type="xs:string" use="required"/>
    <xs:attribute name="is_mandatory" type="xs:boolean" use="required"/>
  </xs:attributeGroup>
  <xs:element name="form">
    <xs:complexType>      
      <xs:sequence>
        <xs:element name="row">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="col">
                <xs:complexType>
                  <xs:sequence>
                    <!-- lable -->
                    <xs:element name="label" type="xs:string"/>
                    <!-- image -->
                    <xs:element name="image" >
                      <xs:complexType>
                        <xs:attribute name="src" type="xs:string" use="required"/>
                      </xs:complexType>
                    </xs:element>
                    <!-- textbox -->
                    <xs:element name="textbox">
                      <xs:complexType>
                        <xs:attributeGroup ref="basics"/>
                        <xs:attribute name="hint" type="xs:string" use="optional" default=""/>
                      </xs:complexType>
                    </xs:element>
                    <!-- yesno -->
                    <xs:element name="yesno">
                      <xs:complexType>
                        <xs:attributeGroup ref="basics"/>                        
                      </xs:complexType>
                    </xs:element>
                    <!-- calendar -->
                    <xs:element name="calendar">
                      <xs:complexType>
                        <xs:attributeGroup ref="basics"/>
                      </xs:complexType>
                    </xs:element>
                    <!-- Select/ multi select -->
                    <xs:element name="select">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="option"/>
                        </xs:sequence>
                        <xs:attributeGroup ref="basics"/>
                        <xs:attribute name="singleChoice" type="xs:boolean" use="required"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>                  
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="title" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

并创建了以下xml(对我来说是一个有效的xml):

<?xml version="1.0" encoding="utf-8" ?>
<form title="title">
    <row>
        <col>
            <textbox title="aaa" field="Name" mandatory="false" hint="aaa"/>
        </col> 
    </row>
    <row>
        <col>
            <textbox title="bbb" field="UID" mandatory="true" hint="bbb"/>
            <yesno title="dddddd" field="field-yesno" mandatory="true"/>
        </col> 
    </row>
    <row>
        <col>
            <lable>dddddd</lable>
        </col>
        </row>
    <row>
        <col>
            <calendar title="cccc" field="StartDate" mandatory="true"/>
        </col>
    </row>
    <row>
        <col>
            <select title="select" field="ffff" mandatory="true">
                <option value="1">option 1</option>
                <option value="2" selected="true">option 2</option>
                <option value="3">option 3</option>
            </select>
        </col>
    </row>
</form>

当我试图验证时:

XmlReaderSettings settings = new XmlReaderSettings();
        settings.Schemas.Add(null, getAbsolutePath("xml''form_schema.xsd"));
        settings.ValidationType = ValidationType.Schema;
        settings.CloseInput = true;
        settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings |
                                   XmlSchemaValidationFlags.ProcessIdentityConstraints |
                                   XmlSchemaValidationFlags.ProcessInlineSchema |
                                   XmlSchemaValidationFlags.ProcessSchemaLocation;
        // create xml reader
        XmlReader reader = XmlReader.Create(new StringReader(xml), settings);
        XmlDocument document = new XmlDocument();
        document.Load(reader);
        document.Validate(new ValidationEventHandler(ValidationHandler));

我得到以下异常:

The element 'col' has invalid child element 'textbox'. List of possible elements expected: 'label'

我的xsd或C#代码出了什么问题?(xml就是一个很好的例子)

C# xml validation

问题似乎出在XSD上。您已经在col元素中指定了一个序列,它期望col看起来像这样:

<col>
    <label />
    <image />
    <textbox />
    <yesno />
    <calendar />
    <select />
</col>

您需要在每个元素上放置minOccurs="0"

<xs:element name="label" type="xs:string" minOccurs="0" />

或使用<xs:choice>

这是您的错误:

<lable>dddddd</lable>

我认为lablelabel不一样。

另外:我可能错了,但你不应该保持正确的秩序吗?您有一个文本框,而xsd中的第一列应该是一个标签。

原因似乎是当您定义了以下XSD时,XML示例中的顺序不正确:

                <xs:element name="label" type="xs:string"/>
                <!-- image -->
                <xs:element name="image" >
                  <xs:complexType>
                    <xs:attribute name="src" type="xs:string" use="required"/>
                  </xs:complexType>
                </xs:element>
                <!-- textbox -->
                <xs:element name="textbox">
                  <xs:complexType>
                    <xs:attributeGroup ref="basics"/>
                    <xs:attribute name="hint" type="xs:string" use="optional" default=""/>
                  </xs:complexType>
                </xs:element>

我不是XSD专家,但我对你的问题很好奇,并在W3Schools.com上阅读了以下内容。我希望我读对了,我只是想展示我在研究你的问题时的发现。

http://www.w3schools.com/Schema/schema_complex.asp

"employee"元素可以通过命名元素直接声明,如下所示:

<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
     <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

如果使用上述方法,则只有"employee"元素可以使用指定的复杂类型。请注意,子元素"firstname"answers"lastname"被指示符包围。这意味着子元素的出现顺序必须与声明的顺序相同。您将在XSD指标一章中了解有关指标的更多信息。