C# 26.07.2020 admin No comments

Валидация XML при помощи XSD в C#

В данной статье мы рассмотрим валидацию 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" maxOccurs="unbounded" minOccurs="0">
          <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.



1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...