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

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
 转载自:http://www.admin5.com/html/edu/Pro/xml/20061226/32120.html

XmlTextWriter类
   用在本节中的方法创建XML文档显然并不困难。多年以来,开发者都是通过在缓存在连接一些字符串,连接好以后再把缓存中字符串输出到文件的方式来创建 XML文档。但是以这种方式创建XML文档的方法只有在你保证字符串中不存在任何细小的错误的时候才有效。.NET Framework通过用 XMLwriter提供了更好的创建XML文档的方法。
  XML Writer类以只前(forward-only)的方式输出XML数据 到流或者文件中。更重要的是,XML Writer在设计时就保证所有的XML数据都符合W3C XML 1.0推荐规范,你甚至不用担心忘记写闭标签, 因为XML Writer会帮你写。XmlWriter是所有 XML writer的抽象基类。.NET Framework只提供唯一的一个 writer 类----XmlTextWriter类。
  我们先来看看XML writers和旧的writers的不同点,下面的代码保存了一个string型的数组:
StringBuilder sb = new StringBuilder("");
sb.Append("");
foreach(string s in theArray) {

sb.Append("
sb.Append(s);
sb.Append("////////"/>");
}
sb.Append("");
   代码通过循环取出数据中的元素,写好标签文本并把它们累加到一个string中。代码保证输出的内容是格式良好的并且注意了新行的缩进,及支持命名空 间。当创建的文档结构比较简单时,这种方法可能不会有错误。然而,当你要支持处理指令,命名空间,缩进,格式化以及实体的时候,代码的数量就成指数级增 长,出错的可能性也随之增长。
  XML writer写方法功能对应每个可能的XML节点类型,它使创建xml文档的过程更符合逻辑、更少 的信赖于繁琐的标记语言。图六演示了怎么样用XmlTextWriter类的方法来连接一个string数据。代码很简洁,用XML writer的代码 更容易读、结构更好。
Figure 6 Serializing a String Array
void CreateXmlFileUsingWriters(String[] theArray, string filename)
{
// Open the XML writer (用默认的字符集)
XmlTextWriter xmlw = new XmlTextWriter(filename, null);
xmlw.Formatting = Formatting.Indented;
 
xmlw.WriteStartDocument();

xmlw.WriteStartElement("array");
foreach(string s in theArray)
{
xmlw.WriteStartElement("element");
xmlw.WriteAttributeString("value", s);
xmlw.WriteEndElement();
}
xmlw.WriteEndDocument();
 
// Close the writer
xmlw.Close();
}
   然而XML writer并不是魔术师----它不能修复输入的错误。XML writer不会检查元素名和属性名是否有效,也不保证被用的任何的 Unicode字符集适合当前架构的编码集。如上所述,为了避免输出错误,必须要杜绝非XML字符。但是writer没有提供这种方法。
   另外,当创建一个属性节点时,Writer不会检验属性节点的名称是否与已存在的元素节点的名称相同。最后,XmlWriter类不是一个带验证的 Writer类,也不保证输出是否符合schema或者DTD。在.NET Framework中带验证的writer类目前来说还没有提供。但是在我写 的《Applied XML Programming for Microsoft .NET (Microsoft Press?, 2002)》书 中,我自己写了一个带验证的Writer组件。你可以到下面的网址去下载源码:http: //www.microsoft.com/MSPress/books/6235.asp.
   图七列出了XML writer的一些状态值(state)。这些值都源于WriteState枚举类。当你创建一个Writer,它的初始状态为 Start,表示你将要配置该对象,实际上writer没有开始。下一个状态是Prolog,该状态是当你调用WriteStartDocument方法 开始工作的时候设置的。然后,状态的转换就取决于你的写的文档及文档的内容了。Prolog状态一直保留到当你增加一个非元素节点时,例如注释元素,处理 指令及文档类型。当第一个节点也就是根节点写完后,状态就变为Element。当你调用WriterStartAtribute方法时状态转换为 Attribute,而不是当你调用WriteAtributeString方法写属性时转换为该状态。如果那样的话,状态应该是Element。当你写 一个闭标签(>)时,状态会转换成Content。当你写完文档后,调用WriteEndDocument方法,状态就会返回为Start,直到你 开始写另一个文档或者把Writer关掉。
Figure 7 States for XML Writer 

State 
Description 

Attribute 
The writer enters this state when an attribute is being written 

Closed 
The Close method has been called and the writer is no longer available for writing operations 

Content 
The writer enters this state when the content of a node is being written 

Element 
The writer enters this state when an element start tag is being written 

Prolog 
The writer is writing the prolog of a well-formed XML 1.0 document 

Start 
The writer is in an initial state, awaiting for a write call to be issued 


   Writer 把输出文本存在内部的一个缓冲区内。一般情况下,缓冲区会被刷新或者被清除,当Writer被关闭前XML文本应该要写出。在任何时你都 可以通过调用Flush方法清空缓冲区,把当前的内容写到流中(通过BaseStream属性暴露流),然后释放部分占用的内存,Writer仍保持为打 开状态(open state),可以继续操作。注意,虽然写了部分的文档内容,但是在Writer没有关闭前其它的程序是不能处理该文档的。 


   可以用两种方法来写属性节点。第一种方法是用WriteStartAtribute方法去创建一个新的属性节点,更新Writer的状态。接着用 WriteString方法设置属性值。写完后,用WriteEndElement方法结束该节点。另外,你也可以用 WriteAttributeString方法去创建新的属性节点,当writerr的状态为Element时, WriterAttributeString开始工作,它单独创建一个属性。同样的,WriteStartElement方法写节点的开始标签 (<),然后你可以随意的设置节点的属性和文本内容。元素节点的闭标签都带”/ >”。如果想写闭标签可以用 WriteFullEndElement方法来写。 

  应该避免传送给写方法的文本中包含敏感的标记字符,例如小于号(<)。用WriteRaw方法写入流的字符串不会被解析,我们可以用它来对xml文档写入特殊的字符串。下面的两行代码,第一行输出的是”<”,第二行输出”<”: 

writer.WriteString("<"); 

writer.WriteRaw("<"); 

 
  读写流 

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

writer.WriteBase64( 

Encoding.Unicode.GetBytes(buf), 

0, buf.Length*2); 
  图八中代码演示了把一个string数据转换为Base64 编码的XML流。图九是输出的结果。 


Figure 8 Persisting a String Array as Base64 

using System; 

using System.Text; 

using System.IO; 

using System.Xml; 



class MyBase64Array 



public static void Main(String[] args) 



string outputFileName = "test64.xml"; 

if (args.Length > 0) 

outputFileName = args[0]; // file name 



// 把数组转换成XML 

String[] theArray = {"Rome", "New York", "Sydney", "Stockholm", 

"Paris"}; 



CreateOutput(theArray, outputFileName); 

return; 





private static void CreateOutput(string[] theArray, string filename) 



// 打开XML writer 

XmlTextWriter xmlw = new XmlTextWriter(filename, null); 

//使子元素根据 Indentation 和 IndentChar 设置缩进。此选项只对元素内容进行缩进 

xmlw.Formatting = Formatting.Indented; 

//书写版本为“1.0”的 XML 声明 

xmlw.WriteStartDocument(); 

//写出包含指定文本的注释 。 

xmlw.WriteComment("Array to Base64 XML"); 

//开始写出array节点 

xmlw.WriteStartElement("array"); 

//写出具有指定的前缀、本地名称、命名空间 URI 和值的属性 

xmlw.WriteAttributeString("xmlns", "x", null, "dinoe:msdn-mag"); 

// 循环的写入array的子节点 

foreach(string s in theArray) 



//写出指定的开始标记并将其与给定的命名空间和前缀关联起来 

xmlw.WriteStartElement("x", "element", null); 

//把S转换成byte[]数组, 并把byte[]数组编码为 Base64 并写出结果文本,要写入的字节数为s总长度的2倍,一个string占的字节数是2字节。 

xmlw.WriteBase64(Encoding.Unicode.GetBytes(s), 0, s.Length*2); 

//关闭子节点 

xmlw.WriteEndElement(); 



//关闭根节点,只有两级 

xmlw.WriteEndDocument(); 



// 关闭writer 

xmlw.Close(); 



// 读出写入的内容 

XmlTextReader reader = new XmlTextReader(filname); 

while(reader.Read()) 



//获取节点名为element的节点 

if (reader.LocalName == "element") 





byte[] bytes = new byte[1000]; 

int n = reader.ReadBase64(bytes, 0, 1000); 

string buf = Encoding.Unicode.GetString(bytes); 



Console.WriteLine(buf.Substring(0,n)); 





reader.Close(); 






  Figure 9 String Array in Internet Explorer 

  Reader类有专门的解释Base64和BinHex编码流的方法。下面的代码片断演示了怎么样用XmlTextReader类的ReadBase64方法解析用Base64和BinHex编码集创建的文档。 

XmlTextReader reader = new XmlTextReader(filename); 

while(reader.Read()) { 

if (reader.LocalName == "element") { 

byte[] bytes = new byte[1000]; 

int n = reader.ReadBase64(bytes, 0, 1000); 

string buf = Encoding.Unicode.GetString(bytes); 

Console.WriteLine(buf.Substring(0,n)); 





reader.Close(); 

   从byte型转换成string型是通过Encoding类的GetString方法实现的。尽管我只介绍了基于Base64编码集的代码,但是可以简 单的用BinHex替换方法名就可以实现读基于BinHex编码的节点内容(用ReadBinHex方法)。这个技巧也可以用于读任何用byte数据形式 表示的二进制数据,尤其是image类型的数据。
如何打造高复现性.NET技术博客:从点滴实践到工业级标准 技术博客的本质是知识传递的有效性,其核心在于能否被读者在真实环境中复现结果。从基础概念看,.NET技术传播长期面临文档抽象、版本碎片与生产环境脱节三大挑战;其原理在于将问题拆解为最小可验证单元,依托诊断工具链(如dotnet-trace、PerfView)定位根因;技术价值体现在降低认知负荷、提升问题解决效率,并构建可度量的内容质量体系;典型应用场景包括企业存量系统维护、.NET Framework向Core迁移、ASP.NET Core性能调优等;而‘老赵点滴’式实践,正是通过版本锚定、故障现场还原、代码 阅读详情

相关推荐

AIGC实战:用ComfyUI和Lora微调打造专属原神角色(含完整工作流)

本文详细介绍了如何利用ComfyUI和Lora微调技术打造专属原神风格角色,涵盖从环境配置、数据集准备到工作流构建和Lora训练的全过程。通过模块化节点设计和高级控制技术,创作者可实现高度个性化的AIGC艺术创作,提升二次元角色生成的效率与质量。

weixin_29185199的博客 305

写入XML 学习总结

写入XML文件 using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Xml;usin

qiaoyongjun888的专栏 406

PC微信逆向:破解聊天记录文件!_读取别人pc微信msg文件

本文详细介绍了PC版微信数据库的解密方法,总结了前人经验并补充了关键细节。通过OllyDbg调试工具从微信内存中获取32字节加密密钥,使用C++结合OpenSSL库实现解密程序。重点解决了开发环境配置问题,包括Visual Studio项目设置和OpenSSL库的版本适配,将原本固定的数据库路径改为参数化输入,提高了工具的通用性。该方案为电子取证中的微信数据提取提供了完整的技术路径,避免了研究者重复探索已解决的问题。

zz96405784848的博客 9465

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

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

杨义贤心灵驿站 610

转载.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数据()

转载自: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

prophet08的专栏 581

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值