Например, есть следующий XML:
<?xml version="1.0" encoding="utf-8" ?> |
Требуется выполнить валидацию XML, например, проверить уникальность значений атрибутов id у вложенных (nested) тегов item. Для это надо определить схему xml в виде .xsd-файла:
<?xml version="1.0" standalone="yes"?> |
<xs:schema id="root" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
| <!-- корневым тегом может быть root --> |
| <xs:element name="root" msdata:IsDataSet="true" msdata:Locale="en-US"> |
| <!-- root может содержать неограниченное кол-во item --> |
| <xs:choice minOccurs="0" maxOccurs="unbounded"> |
| <xs:element ref="item" /> |
| <!-- правило для атрибута id в item --> |
| <xs:unique name="uid" msdata:PrimaryKey="true"> |
| <xs:selector xpath=".//item" /> |
| <!-- определение тега item --> |
| <!-- может содержать неограниченное кол-во подтегов item --> |
| <xs:element ref="item" minOccurs="0" maxOccurs="unbounded" /> |
| <!-- определение атрибута id --> |
| <xs:attribute name="id" type="xs:string" /> |
Валидация выполняется с помощью следующего кода:
XmlReaderSettings xs = new XmlReaderSettings(); |
xs.Schemas.Add("", new XmlTextReader(@"test.xsd")); |
xs.ValidationType = ValidationType.Schema; |
xs.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings | XmlSchemaValidationFlags.ProcessIdentityConstraints; |
xs.ValidationEventHandler += (s, e) => |
| System.Diagnostics.Trace.WriteLine(e.Exception.LineNumber + " " + e.Message); |
XmlReader xr = XmlReader.Create("test.xml", xs); |
Информация обо всех ошибках передается в обработчик события ValidationEventHandler.
Для приведенного выше xml получим следующие сообщения:
5 There is a duplicate key sequence '0' for the 'uid' key or unique identity constraint.
7 There is a duplicate key sequence '0' for the 'uid' key or unique identity constraint.
(5 и 7 - номера строк в xml)
Комментариев нет:
Отправить комментарий