转载:.NET Framework轻松处理XML数据(三)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情
转载自:http://www.admin5.com/html/edu/Pro/xml/20061226/32119.html


带验证的阅读器
   XmlValidatingReader类实现了XmlReader类,它提供了支持多种类型的XML验证:DTD,XML-Data Reduced (XDR)架构,以及XSD,DTD和XSD都是W3C官方推荐的。而XDR是Microsoft早期用于处理XML构架的一种格式。
  你 可以用XmlVlidatingReader类去验证XML文档和XML片断。XmlValidatingReader类工作在XML阅读器上面---是 一个典型的XMLTextReader类实例。XMLTextReade用于读取文档的节点,但是XmlVlidatingReader依据需要的验证类 型去验证每一个XML块。
  XmlVlidatingReader类只实现了非常小的XML阅读器必备的一个功能子集。该类总是工作在一个 已存在的XML阅读器上面,它监视方法和属性。如果你深入该类的构造函数,你会发现它很明显的依靠一个已存在的文本阅读器。带验证的XML阅读器不能直接 的从一个文件或一个URL序列化。该类的构造函数列表如下:
public XmlValidatingReader(XmlReader);
public XmlValidatingReader(Stream, XmlNodeType, XmlParserContext);
public XmlValidatingReader(string, XmlNodeType, XmlParserContext);
  带验证的XML阅读器能分析任何的XML片断,XML片断通过一个string或者一个stream提供,也可以分析任何阅读器提供的XML文档。
   XmlVlidatingReader类中有重大改变的方法非常少(相对其它reader类来说),另外对 Read,它有Skip和 ReadTypedValue方法。Skip方法跳过当前节点所有的子节点(你不能跳过不良格式的XML文本,它是相当有用的算法),Skip方法也验证 被跳过的内容。ReadTypedValue方法返回指定 XML 架构 (XSD) 类型对应的CLR类型。如果该方法找到了XSD类型对应的CLR类 型,则返回CLR的类型名。如果找不到,则把该节点的值作为一个字符串值返回。
  带验证的XML阅读器正如其名,它是一个基于节点的阅读 器,它验证当前节点的结构是否符合当前的schema。验证是增量式的;它没有方法返回表示文档是否有效的布尔值。通常你都是用Read方法去读输入的 XML文档。实际上,你也可以用带验证的阅读器去读XML文档。在每一步中,当前被访问的节点的结构是否与指定的schema符合,如果不符合,抛出一个 异常。图四是一个控制台应用程序,它有一个要输入文件名的命令行,最后输出验证结果。
Figure 4 Console App
using System;
using System.Xml;
using System.Xml.Schema;
 
class MyXmlValidApp
{
public MyXmlValidApp(String fileName)
{
try {
Validate(fileName);
}
catch (Exception e) {
Console.WriteLine("Error:/t{0}", e.Message);
Console.WriteLine("Exception raised: {0}",
e.GetType().ToString());
}
}
 
private void Validate(String fileName)
{
XmlTextReader xtr = new XmlTextReader(fileName);
XmlValidatingReader vreader = new XmlValidatingReader(xtr);
vreader.ValidationType = ValidationType.Auto;
vreader.ValidationEventHandler += new
ValidationEventHandler(this.ValidationEventHandle);
 
vreader.Read();
vreader.MoveToContent();
 
while (vreader.Read()) {}
 
xtr.Close();
 vreader.Close();
}

public void ValidationEventHandle(Object sender,
ValidationEventArgs args)
{
Console.Write("Validation error: " + args.Message + "/r/n");
}

public static void Main(String[] args)
{
MyXmlValidApp o = new MyXmlValidApp(args[0]);
return;
}
}
   ValidationType属性设置验证的类型,它可以是:DTD, XSD, XDR或者none。如果没有指定验证的类型(用 ValidationType.Auto选项),阅读器将自动的根据文档用最适合的验证类型。在验证过程中出现任何错误,都会触发 ValidationEventHandler事件。如果未提供事件ValidationEventHandler事件处理程序,则抛出一个XML异常。 定义ValidationEventHandler事件处理程序是用于捕捉任何在XML源文件中存在错误而引发XML异常的一种方法。要注意的是阅读器的 原理是检查一个文档是否是格式良好的,以及检查文档是否与架构吻合。如果带验证的阅读器发现一个有严重的格式错误的XML文档,只会触发 XmlException异常,它不会触发其它的事件。 

  验证发生在用户用Read方法向前移动指针时,一旦节点被分析和读取,它获得传送过来的处理验证的内部的对象。验证操作是基于节点类型及被要求的验证类型。它确认节点所有的属性和节点包含的子节点是否符合验证条件。 

   验证对象在内部调用两个不同风格的对象:DTD分析器和架构生成器(schema builder)。DTD分析器处理当前节点的内容和不符合DTD的 子树。架构生成器根据XDR或者XSD架构对当前的节点构建一个SOM(schema object model)。架构生成器类实际上是所有指定为 XDR和XSD架构生成器的基类。为什么呢,虽然XDR和XSD架构的许多相同的方法被加工处理过,但是它们在执行时的性能没有区别。 

  如果节点有子节点,用另一个临时的阅读器收集子节点信息,因此节点的架构信息能被完全地验证。你可以看图五: 


   注意,尽管XmlValidatingReader类的构造函数可以接受一个XmlReader类作为其阅读器,但是该阅读器只能是 XmlTextReader类的一个实例或者是它的一个派生类的实例。这意味着你不能用其它从XmlReader派生的类(例如一个自定义的XML阅读 器)。在XmlValidatingReader类的内部,它假设阅读器是一个子XmlTextReader对象及把传入的阅读器显式的转换成 XmlTextReader类。如果你用XmlNodeReader或者自定义的阅读器器,程序在编译时会出错,运行时抛出一个异常。 


  节点阅读器 

   XML阅读器提供一种增量式的方法(一个一个节点的读)来处理文档的内容。到目前为止,我们假设源文件是一个基于硬盘的流或者是一个字符串流,然而,我 们不能保证在实际中会提供一个源文件的XMLDOM对象给我们。在这种情况下,我们需要一个带有特别的读方法的特别的类。对这种情况,. NET Framework提供了XmlNodeReader类。 

  就像XmlTextReader访问指定XML流中所有节点 一样,XmlNodeReader类访问XMLDOM子树的所有节点。XMLDOM类(在.NET Framework中的XmlDocument类)支 持基于Xpath的方法,例如SelectNodes方法和SelectSingleNode方法。这些方法的作用是把匹配的节点放在内存中。如果你需要 处理子树中的所有节点,节点阅读器比用增量式方法处理节点的阅读器具有更高的效率: 

// xmldomNode is the XML DOM node 

XmlNodeReader nodeReader = new XmlNodeReader(xmldomNode); 

while (nodeReader.Read()) 



// Do something here 



  当你要在配置文件(例如web.cofig文件)中引用自定义的数据时,先把这些数据填充到XMLDOM树中,然后用XmlNodeReader类与XMLDOM类结合处理这些数据。这也是高效的。
 
如何打造高复现性.NET技术博客:从点滴实践到工业级标准 技术博客的本质是知识传递的有效性,其核心在于能否被读者在真实环境中复现结果。从基础概念看,.NET技术传播长期面临文档抽象、版本碎片与生产环境脱节大挑战;其原理在于将问题拆解为最小可验证单元,依托诊断工具链(如dotnet-trace、PerfView)定位根因;技术价值体现在降低认知负荷、提升问题解决效率,并构建可度量的内容质量体系;典型应用场景包括企业存量系统维护、.NET Framework向Core迁移、ASP.NET Core性能调优等;而‘老赵点滴’式实践,正是通过版本锚定、故障现场还原、代码 阅读详情

相关推荐

Python连接StarRocks全流程实践: SQL文件调用与Pandas混合优化

通过这种分阶段混合计算, 既能发挥StarRocks处理海量数据的性能优势, 又能保留Pandas在内存计算中的灵活性, 实现效率与功能的完美平衡.结合SQL的高效聚合与Pandas的灵活计算, 实现查询和数据处理的深度融合.该库基于SQLAlchemy 2.x开发, 仅支持Python 3.x环境.对大批量数据的写入, 建议进行分块. 分块写入较单条插入速度会有显著提升.这样可以避免python代码的查询与SQL耦合, 支持版本化管理.将DDL, DML分离为独立文件, 例如。: 调整连接复用参数。

t.y.Tang的博客 2733

转载.NET Framework轻松处理XML数据()

 转载自:http://www.admin5.com/html/edu/Pro/xml/20061226/32120.htmlXmlTextWriter类    用在本节中的方法创建XML文档显然并不困难。多年以来,开发者都是通过在缓存在连接一些字符串,连接好以后再把缓存中字符串输出到文件的方式来创建 XML文档。但是以这种方式创建XML文档的方法只有在你保证字符串中不存在任何细小的错误的时候才有

prophet08的专栏 497

拆解大疆M300电池BMS:基于TI TIDA-010030方案的硬件架构深度分析

本文深度解析了大疆M300无人机电池管理系统(BMS)基于TI TIDA-010030参考设计的硬件架构。通过对比TI方案与大疆实现的差异,详细介绍了BQ7694003监控前端和BQ34Z100电量计的优化设计,以及通信架构的可靠性改进。文章还揭示了大疆在成本、空间和标准化方面的工程妥协与创新平衡,为锂电池保护方案提供了实践参考。

weixin_27066963的博客 210

转载.NET Framework轻松处理XML数据()

 在. NET Framework中,XmlTextReader和XmlTextWriter类提供了对xml数据的读和写操作。在本文中,作者讲述了XML 阅读器(Reader)的体系结构及它们怎样与XMLDOM 和SAX 解释器结合。作者也演示了怎么样运用阅读器分析和验证XML文档,怎么样创建格式 良好的XML文档,以及怎么样用函数读/写基于Base64和BinHex编码的大型的XML文档。最后,

prophet08的专栏 531

转载.NET Framework轻松处理XML数据()

转载:http://www.admin5.com/html/edu/Pro/xml/20061226/32118.html分析属性值   大部分情况下,属性值都是一个简单的文本字符串。然而,这并不意味着实际应用中的属性值都是字符型的。有时候,属性值是由 许多种类型的数据组合而成的,例如Date或Boolean,这时,你就要用XmlConvert或System.Convevt类的方法把这些

prophet08的专栏 598

转载.NET Framework轻松处理XML数据(5)

 转载   www.ASPCool.comXMLTextWriter类     用在本节中的方法创建XML文档显然并不困难。多年以来,开发者都是通过在缓存在连接一些字符串,连接好以后再把缓存中字符串输出到文件 的方式来创建XML文档。但是以这种方式创建XML文档的方法只有在你保证字符串中不存在任何细小的错误的时候才有效。.net Framework通过用XMLwriter提供了更好的创建XML

prophet08的专栏 627

php .net2 .net4,在.NET Framework轻松处理XML数据(4-2)

Figure 7 States for XML WriterStateDescriptionAttributeThe writer enters this state when an attribute is being writtenClosedThe Close method has been called and the writer is no longer available for w...

weixin_35201342的博客 126

转载.NET Framework轻松处理XML数据(7)

转载   www.ASPCool.com设计XMLReadWriter类     如前面所说,XML reader和Writer是各自独立工作的:reader只读,writer只写。假设你的应用程序要管理冗长的XML文档,且该文档有不确定的数据。 Reader提供了一个很好的方法去读该文档的内容。另一方面,Writer是一个非常有用的用于创建XML文档片断工具,但是如果你想要它即能读,又能 写,

prophet08的专栏 622

转载.NET Framework轻松处理XML数据(6)

 转载   www.ASPCool.com读写流        有趣的是,reader(阅读器)和writer类提供了基于Base64 和BinHex编码的读写数据流的方法。WriteBase64 和 WriteBinHex方法的功能与其它的写方法的功能存在着细微的差别。它们都是基于流的,这两个方法的功能像一个byte数组而不是一个 string。下面的代码首先把一个string转换成一个by

prophet08的专栏 502

.NET Framework轻松处理XML数据

http://topic.csdn.net/t/20030523/16/1825086.html http://www.sosuo8.com/article/show.asp?id=1305 http://www.cnblogs.com/angelfeather/articles/767415.html 转载:https://www.cnblogs.com/29...

weixin_30877227的博客 118

.Net Framework

.Net Framework 提供了一整套应用程序的开发平台,它实际上是有一大堆的技术组合而成,这些技术彼此协作,能为开发人员提供无限的运用。 .Net Framework 由以下几部分组成: .Net语言包:包括Visual Basic.NET,C#,J#和c++等; 通用语言运行时(CLR:Common Language Runtime):提供所有.Net 程序的...

weixin_33698823的博客 109

【新品上架】数据分析工具FastCube.Net暖春来袭,使您轻松分析数据并构建汇总表...

FastCube.Net——一种有效的数据分析工具 FastCube使您能够分析数据并构建汇总表(数据切片),以及轻松,即时地创建各种报表和图表。它是高效分析数据阵列的便利工具。 立即下载最新试用版>> FastCube是一组OLAP桌面组件。 它支持 .Net Framework 4.与FastCube 2 VCL兼容。 FastCube组件可以内置到主...

301

浅谈对象的序列化(Serialize)

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,就使得数据能够被轻松地存储和传输。 .NET Framework 提供两种序列化技术: 二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远...

weixin_30871701的博客 282

php service原理,轻松搞懂WebService工作原理

用更简单的方式给大家谈谈WebService,让你更快更容易理解,希望对初学者有所帮助。WebService是基于网络的、分布式的模块化组件。我们直接来看WebService的一个简易工作流程:客户端 ——>阅读WSDL文档(了解webservice的请求) ——> 调用WebService上面的流程是一个大致的描述,客户端阅读WSDL文档发送请求,然后调用Web服务器最后返回给客户端...

weixin_42520025的博客 133

谈谈:.Net中的序列化和反序列化

序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一些理解。 一、什么序列化和反序列化 序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中。反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程。 ...

weixin_30826761的博客 73

对话Spring.net

Spring.NET可以应用于许多场景。核心特性如依赖注入(DI)容器、AOP以及数据访问框架,都可以非常好地应用在任意的.NET应用程序中。它使得你能够创建更简单、更干净的应用程序。为了尽量消除它所带来的副作用,开发人员还可以免费获得功能强大的配置机制。 如果你正在编写一个ASP.NET Web应用程序,你可以考虑将Spring.NET Web框架(Spring.Web)加入其中。因为它是AS...

weixin_30586085的博客 107

图形图像处理CAD控件Vectordraw Developer Framework下载

下载该控件请到cad控件网www.cadkong.com VectorDraw Developer Framework (VDF)为您的应用程序增加动态的2D/3D图形。是一个可轻松创建爱你和管理及打印2D和3D图形的构件。 其对象可显示与大多数公共矢量格式和其他CAD对象兼容的方法和属性。 支持10多种矢量格式和多种离散格式。VectorDraw Developer Framework (...

weixin_30835923的博客 206

.NetFramework 数据保存与传输之序列化对象

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,就使得数据能够被轻松地存储和传输。 .NET Framework 提供两种序列化技术: 二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等...

weixin_33778778的博客 136

序列化

序列化 (serialization)   将对象的状态信息转换为可以存储或传输的窗体的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。   序列化使其他代码可以查看或修改那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 ...

weixin_30488085的博客 56

为什么要使用 F#?

对于小部分 .NET 程序员来说,学习一门 .NET Framework 函数化语言无疑将使自己在编写功能强大软件方面前进一大步。而对其他程序员来说,学习 F# 的理由就因人而异了。F# 能为开发人员提供哪些益处? 随着多核 CPU 的普及,安全并发程序已成为过去年来的关注焦点。函数式语言倡导一种固定不变的数据结构,可在线程和机器之间传递,而无需担心线程安全或原子访问,开发人员可以利用这...

weixin_30647065的博客 257

序列化与反射

公共语言运行库加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。反射通常具有以下用途: 使用 Asse...

weixin_30593443的博客 178
上一篇: 转载:.NET Framework轻松处理XML数据(二)
下一篇: 转载:.NET Framework轻松处理XML数据(四)
prophet08
博客等级 码龄19年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值