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就是一个很好的例子)
问题似乎出在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>
我认为lable
和label
不一样。
另外:我可能错了,但你不应该保持正确的秩序吗?您有一个文本框,而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指标一章中了解有关指标的更多信息。