`
wfdoublext
  • 浏览: 128662 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

xml验证 转载

阅读更多

 

开发环境:VS2008

在.NET中说到验证XML,估计不少人会想到用类XmlValidatingReader,谁知在.NET2.0时此类已标记为已过时,取而代之的是XmlReaderSettings类,

此类其实很简单,使用时只需设置少数属性。

验证过程中代码相对简单,主要是有一些细节需要注意。

下面先介绍XmlReaderSettings类用到的两个属性

Schemas 获取或设置在执行架构验证时使用的 XmlSchemaSet
ValidationType 获取或设置一个值,该值指示 XmlReader 在读取时是否执行验证或类型分配。

 

 

<?xml version="1.0" encoding="utf-8" ?>
<!--
    注意默认命名空间,当XSD上有属性targetNamespace时,
    此默认命名空间是必要的,而且必须和targetNamespace的值一样
-->
<book xmlns="http://www.cnblogs.com/lucas/">
    <title>书名</title>
    <price>12.99</price>
</book>

 

 

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="book"
    targetNamespace="http://www.cnblogs.com/lucas/"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/book.xsd"
    xmlns:mstns="http://tempuri.org/book.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

    <xs:element name="book">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="title" type="xs:string" />
                <xs:element name="price" type="xs:decimal" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>

 

 

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        XmlReaderSettings settings = new XmlReaderSettings();
        //验证类型设置为模式(xsd)
        settings.ValidationType = ValidationType.Schema;
        //为XmlReaderSettings对象添加模式
        //第一个参数是targetNamespace的值,null表示采用XSD文件里targetNamespace属性的值
        //如果要明确传递此参数,务必与targetNamespace的值一致
        //第二个参数一定要采用绝对路径或物理路径,不能采用相对路径
        settings.Schemas.Add(null, Server.MapPath("book.xsd"));
        //添加验证错误的处理事件
        settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler);

        //同理第一个参数必须是绝对路径或物理路径
        XmlReader reader = XmlReader.Create(Server.MapPath("book.xml"), settings);

        while (reader.Read())
        {
        }
        reader.Close();
        this.ltlMsg.Text += "End";
    }

    void settings_ValidationEventHandler(object sender, System.Xml.Schema.ValidationEventArgs e)
    {
        this.ltlMsg.Text += e.Message + "<br />";
    }
}

1. 验证XML文档的步骤

(1) 定义一个ValidationEventHandler事件处理程序方法。

(2) 创建XmlReaderSettings对象的实例。XmlReaderSettings类允许指定一套由XmlReader对象支持的选项,并且这些选项将会在解析XML数据的时候起作用。请注意XmlReaderSettings生成废弃的XmlValidatingReader(用于.NET 1.x版本)

(3) 将前面定义好的ValidationEventHandler方法与XmlReaderSettings类相关联。

(4) XmlReaderSettingsValidationType属性设置为ValidationType.Schema

(5) XmlReaderSettings类的Schema属性将XSD模式添加至XmlReaderSettings类。

(6) 在解析XML数据的时候,XmlReader类使用Read方法验证XML文档。

验证事件处理程序

ValidationEventHandler事件定义了一个事件处理程序,用于接收关于XSD模式验证错误的通知。验证的错误和警告通过ValidationEventHandler回调函数来报告。验证错误不会停止解析,解析只会在XML文档不是格式良好时停止。但是,如果您没有提供验证事件处理程序的回调函数并且发生了验证错误,将会抛出异常。使用验证事件回调机制捕获所有验证错误的这种方式可以在单步过程中发现所有的验证错误。

XML验证中XmlReaderSettings类的角色

XmlReaderSettings类和XmlReader类一样是最重要的类之一,它提供了验证XML数据的核心基础。表5-1提供了XmlReaderSettings类中验证相关属性的简要描述,本章后部分将会利用这些属性。

 

 

5-1  验证X mlReaderSettings类的相关属性和事件

    

    

ProhibitDtd

指示XmlReaderSettings类是否支持DTD验证。默认值是true,表示不支持DTD验证

ValidationType

指定XmlReaderSettings类支持的验证类型。允许的验证类型是DTDXSDNone

ValidationEventHandler

指定事件处理程序,用于接收关于验证事件的信息

ValidationFlags

指定在验证XML数据时将被强制执行的附加的验证设置,如使用内嵌模式、身份约束和XML属性

Schemas

获得或者设置XmlSchemaSet对象,该对象表示用于执行模式验证的模式集合

 

为了能够使用XmlReaderSettings类来验证XML数据,必须将XmlReaderSettings类的属性设置为正确的值。这个类本身无法运行,而需要与XmlReader或者XmlNodeReader实例一同运行。您可以使用这个类并依据DTDXML模式进行验证。

3. 处理XML验证中的异常

在程序清单5-3中,只要出现了XML验证错误,控制就会自动转向ValidationEventHandler方法,来处理异常并将验证错误消息(通过ValidationEventArgs对象的Message属性获得)添加至StringBuilder对象。如果StringBuilder对象包含了所有消息,最后这个错误消息将会显示给用户。虽然这对本示例来说已经足够,但是很多时候您会想要区分不同的异常类型,如在验证过程中产生的警告或者错误。为了达到这个目的,可以检查ValidationEventArgs对象的Severity属性。这个属性返回XmlSeverityType类的枚举,可用于判断产生的异常类型。表5-3显示了这个枚举所包含的值。

5-3  XmlSeverityType枚举值

    

Error

指示在验证实例文档时出现了验证错误。这可以是使用DTDXSD模式的验证结果。如果没有验证事件处理程序来处理这种情况,将会抛出异常

Warning

指示验证解析器已经运行到一个没有错误但是有必要警告用户的情况之下。WarningError的不同之处是它不会在调用方法的应用程序中抛出异常

分享到:
评论

相关推荐

    [转载] JAXB中Java对象和XML之间的转换

    8. **性能优化**: 对于大规模数据处理,JAXB提供了缓存机制,可以通过`Marshaller.setSchema()`设置XML Schema以进行验证,并提高性能。 9. **使用XPath**: JAXB还允许通过XPath表达式选择XML中的特定部分进行操作...

    xml 解析,下边是位哥们的全新奉献,这里我转载了,谢谢这位哥们。。

    XML还定义了命名空间、DTD(Document Type Definition)或XML Schema来验证文档结构和数据的正确性。 XML解析分为两种主要类型:DOM(Document Object Model)解析和SAX(Simple API for XML)解析。 1. DOM解析:...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地...

    Castor学习笔记 (转载)

    `test.xml`可能是测试用例的数据文件,用于验证映射配置是否正确,以及Castor序列化和反序列化功能是否按预期工作。 总的来说,Castor作为一个强大的数据绑定工具,简化了Java应用与XML数据之间的交互。通过理解和...

    关于jquery ajax 调用带参数的webservice返回XML数据一个小细节

    综上所述,开发者在利用jQuery进行AJAX调用Web服务时,应注重参数传递的正确方式,确保数据能够被Web服务正确解析,同时也要有批判性地获取和使用网上的技术信息,避免盲目转载不准确的内容。这些实践能够提高开发...

    转载app安全

    1. **Allowbackup漏洞**:当AndroidManifest.xml文件中的`allowBackup`属性设为`true`时,应用的数据可以被轻易备份,导致用户数据泄露。解决办法是将`android:allowBackup`属性设置为`false`。 2. **WebView漏洞**...

    转载CAS_SSO单点登录实例详细步骤

    2. **应用系统配置**:每个应用系统需要配置成CAS客户端,这通常涉及到修改web.xml配置文件,添加CAS过滤器和配置服务URL。 3. **URL重定向**:当用户访问应用系统时,如果未登录,会被重定向到CAS服务器进行身份...

    用STRUTS的TOKEN机制解决表单重复提交,转载自:百度文库

    在表单提交过程中,服务器会将Token附加到表单中,当客户端提交表单时,服务器会验证这个Token是否有效且未被使用过。 1. **Token的生成**: 在Struts的Action中,我们可以创建一个Token并将其存储到用户的Session...

    Spring-Security-3应用的11个步骤.docx

    1. **Web.xml配置** - 配置Spring Security的过滤器,比如`&lt;http&gt;`元素,通过`auto-config`属性启用自动配置,并定义拦截URL以指定哪些页面需要特定角色的访问权限。 2. **Spring配置** - 在Spring配置文件中添加...

    JAVA OA平台源码(转载)SPRING BOOT....

    【标题】:“JAVA OA平台源码(转载)SPRING BOOT...” 这个开源项目是一个基于Java技术的OA(Office Automation)管理系统的源代码实现,利用了Spring Boot框架进行开发。Spring Boot是Spring生态中的一个核心组件...

    dwr中文教程~转载的,共享一下

    5. **安全验证**:DWR会检查每个请求,确保其来源合法性。 四、DWR的主要功能 1. **实时更新**:DWR支持实时更新页面部分,例如表格数据、图表等。 2. **异步操作**:DWR的批量处理功能允许多个服务器调用在一个...

    Servlet和Struts2的交互(转载)

    拦截器允许开发者定义在Action执行前后执行的逻辑,比如日志记录、权限验证等。插件机制则方便了第三方库的集成,如Spring、Hibernate等。OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于在...

    tomcat使用memcached集群session共享(转载并修改)

    可以通过观察 Memcached 客户端工具或者监控日志来验证 Session 是否成功共享。 总结来说,通过 Tomcat 和 Memcached 集群的集成,我们可以实现跨服务器的 Session 共享,这对于高并发、分布式部署的 Web 应用至关...

    【转载】Maven 模块划分

    Maven拥有一个标准的生命周期,包括清理(Clean)、初始化(Initialize)、编译(Compile)、测试(Test)、打包(Package)、验证(Verify)、集成测试(Integration-test)、部署(Deploy)等阶段。开发者可以...

    C#.NET经典案例解析转载

    此外,它还可能涉及到Windows Forms或WPF界面设计,以及事件处理和数据验证。 酒店管理系统则涉及预订、入住、退房流程,可能还包括房间类型管理、账单计算等功能。在C#中实现这类系统需要熟悉多线程、时间管理和...

    Python车辆违章查询系统源码.zip

    3. 数据解析:返回的违章信息通常是以JSON或XML格式的数据,需要使用如json或xml库进行解析,将原始数据转换为Python可以处理的对象。 4. 数据展示:查询结果可能需要以友好的方式呈现给用户,这可能涉及到使用...

Global site tag (gtag.js) - Google Analytics