【问题标题】:Validating XML tag by tag逐个标签验证 XML 标签
【发布时间】:2010-10-03 08:17:44
【问题描述】:

我在使用 .net 和 C# 根据 Schema 验证某些 XML 时遇到一些问题。

我将 XmlReaderSettings 与 ValidationEventHandler 一起使用。

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

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

非常感谢

【问题讨论】:

  • 您是如何处理 ValidationEvent 的?我们可以看看一些代码吗?
  • 您好,感谢您的回复! 1. XML 是有效的,但对于每个架构无效。 2. 本机暂无代码,正在工作中,但会尽快更新具体代码!

标签: c# xml validation schema tags


【解决方案1】:

XMLReader 被描述为一个

提供对 XML 数据的快速、非缓存、只进的访问的阅读器。

来自the API documentation 以及您对应用程序行为的描述,听起来像是引发了异常,并且定义了某种形式的验证回调方法,该方法执行一些非致命的操作(例如记录警告)然后返回控制到有问题的元素上一级的验证器。

顺便说一句:xml 元素被称为“元素”,而不是“标签”

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 2015-11-25
      • 2019-07-20
      相关资源
      最近更新 更多