Проверка тега XML по тегу - PullRequest
0 голосов
/ 24 января 2009

У меня возникли некоторые проблемы при проверке некоторых XML по схеме, используя .net и C #.

Я использую XmlReaderSettings с ValidationEventHandler.

Однако, похоже, это перестает перехватывать ошибки после того, как он обнаружил первую ошибку на определенном уровне в файле XML, вместо проверки следующего тега на том же уровне, поэтому в основном он не проверяет каждый тег внутри Вместо этого XML-файл пропускает уровень, когда обнаружил ошибку.

Я надеялся получить совет от кого-то, кто успешно выполнил этот тип проверки.

Большое спасибо

Ответы [ 2 ]

1 голос
/ 29 января 2009

Звучит так, как будто в вашей схеме определено xsd:sequence, и ошибка возникает, когда порядок элементов в вашем документе не соответствует порядку элементов, определенных в схеме.

С учетом этой схемы:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema 
    attributeFormDefault="unqualified" 
    elementFormDefault="qualified" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="Dog">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Age" type="xsd:int"/>
                <xsd:element name="Name" type="xsd:string"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

и этот XML:

<Dog>
    <Name>Rex</Name>
    <Age>three</Age>
</Dog>

Вы можете себе представить, что проверка создаст две ошибки:

1. The element 'Dog' has invalid child element 'Name'.
2. The 'Age' element is invalid - The value 'three' is invalid according to its datatype

Но вы видите только первую ошибку. Это связано с тем, что из-за первой ошибки недопустимого дочернего элемента XmlReader невозможно проанализировать оставшуюся часть документа, поскольку он больше не знает, чего ожидать дальше.

0 голосов
/ 29 января 2009

XMLReader описывается как

считыватель, обеспечивающий быстрый, не кэшированный, прямой доступ к данным XML.

из документации API и из ваших описаний поведения вашего приложения кажется, что выброшено исключение, и что определена некоторая форма метода обратного вызова проверки, который делает что-то не фатальное (например, ведение журнала предупреждение), а затем возвращает управление в валидатор на один уровень выше нарушающего элемента.

Кстати: элементы xml называются «элементы», а не «теги»

...