В данной статье мы рассмотрим валидацию XML при помощи XSD.
Для примера возьмём следующую XSD схему:
<?xml version="1.0"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="body"> <xs:complexType> <xs:sequence> <xs:element name="person" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element type="xs:string" name="firstName"/> <xs:element type="xs:string" name="lastName"/> <xs:element name="age"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="0"/> <xs:maxInclusive value="150"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Корректный XML:
<?xml version="1.0" encoding="utf-8"?> <body> <person> <firstName>Андрей</firstName> <lastName>Иванов</lastName> <age>20</age> </person> </body>
Для того, чтобы получить ошибки валидации, немного изменим корректный XML и будем использовать его.
Некорректный XML:
<?xml version="1.0" encoding="utf-8"?> <body> <person> <lastName>Иванов</lastName> <age>1000</age> </person> </body>
В данном XML было убрано значение firstName, а также установлен некорректный возраст.
Программный код:
using System; using System.Xml.Linq; using System.Xml.Schema; namespace XmlValidator { class Program { static void Main(string[] args) { XmlSchemaSet schemas = new XmlSchemaSet(); schemas.Add(null, @"D:\\schema.xsd"); XDocument document = XDocument.Load(@"D:\\document.xml"); document.Validate(schemas, (sender, validationEventArgs) => { Console.WriteLine(validationEventArgs.Message); }); } } }
В итоге мы получим следующий результат:
The element 'person' has invalid child element 'lastName'. List of possible elements expected: 'firstName'.
Хочу отметить, что мы видим сообщение только о firstName, но про age информации нет. После получения первой ошибки валидатор не анализировал данное значение.
Давайте попробуем добавить обратно значение firstName и запустим код ещё раз.
Обновлённый XML:
<?xml version="1.0" encoding="utf-8"?> <body> <person> <firstName>Андрей</firstName> <lastName>Иванов</lastName> <age>1000</age> </person> </body>
В этот раз мы уже увидим сообщение по-поводу возраста:
The 'age' element is invalid - The value '1000' is invalid according to its datatype 'Integer' - The MaxInclusive constraint failed.