按标记验证XML标记

时间:2009-01-24 17:23:46

标签: c# xml validation schema tags

我遇到了一些使用.net和C#验证某些XML的问题。

我正在使用带有ValidationEventHandler的XmlReaderSetting。

但是,这似乎在XML文件中的特定级别遇到第一个错误后停止捕获错误,而不是检查同一级别的下一个标记,所以基本上它不检查每个标记内的每个标记XML文件,而不是在发现错误时跳过某个级别。

我希望从成功完成此类验证的人那里得到一些建议。

非常感谢

2 个答案:

答案 0 :(得分:1)

这听起来好像您的架构中定义了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无法解析文档的其余部分,因为它不再知道接下来会发生什么。

答案 1 :(得分:0)

XMLReader被描述为

  

提供快速,非缓存,仅向前访问XML数据的阅读器。

来自the API documentation

以及你对应用程序行为的描述听起来像是抛出异常,并且定义了某种形式的验证回调方法,它可以执行非致命的操作(如记录警告)和然后将控制权返回到违规元素上一级的验证者。

顺便说一下:xml元素被称为'elements',而不是'tags'