.NET操作XML--XMLTextWriter

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

[c-sharp]  view plain copy print ?
  1. void CreateXMLFileUsingWriters(String[] theArray, string filename)   
  2.   
  3. {   
  4.   
  5. // Open the XML writer (用默认的字符集)   
  6.   
  7. XMLTextWriter xmlw = new XmlTextWriter(filename, null);   
  8.   
  9. XMLw.Formatting = Formatting.Indented;   
  10.   
  11. XMLw.WriteStartDocument();   
  12.   
  13. XMLw.WriteStartElement("array");   
  14.   
  15.  XML Writer类以只前(forward-only)的方式输出XML数据到流或者文件中。更重要的是,XML Writer在设计时就保证所有的XML数据都符合W3C XML 1.0推荐规范,你甚至不用担心忘记写闭标签,因为XML Writer会帮你写。XmlWriter是所有 XML writer的抽象基类。.NET Framework只提供唯一的一个writer 类----XmlTextWriter类foreach(string s in theArray)   
  16.   
  17. {   
  18.   
  19. XMLw.WriteStartElement("element");   
  20.   
  21. XMLw.WriteAttributeString("value", s);   
  22.   
  23. XMLw.WriteEndElement();   
  24.   
  25. }   
  26.   
  27. XMLw.WriteEndDocument();   
  28.   
  29. // Close the writer   
  30.   
  31. XMLw.Close();   
  32.   
  33. }   

 

然而XML writer并不是魔术师----它不能修复输入的错误。XML writer不会检查元素名和属性名是否有效,也不保证被用的任何的Unicode字符集适合当前架构的编码集。如上所述,为了避免输出错误,必须要杜绝非XML字符。但是writer没有提供这种方法。

XML writer 还有一些状态值(state)。这些值都源于WriteState枚举类。当你创建一个Writer,它的初始状态为Start,表示你将要配置该对象,实际上writer没有开始。下一个状态是Prolog,该状态是当你调用WriteStartDocument方法开始工作的时候设置的。然后,状态的转换就取决于你的写的文档及文档的内容了。Prolog状态一直保留到当你增加一个非元素节点时,例如注释元素,处理指令及文档类型。当第一个节点也就是根节点写完后,状态就变为Element。当你调用WriterStartAtribute方法时状态转换为Attribute,而不是当你调用WriteAtributeString方法写属性时转换为该状态。如果那样的话,状态应该是Element。当你写一个闭标签(>)时,状态会转换成Content。当你写完文档后,调用WriteEndDocument方法,状态就会返回为Start,直到你开始写另一个文档或者把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);

以下是写入和读取XML文档的示例:

Figure 8 Persisting a String Array as Base64

 

[c-sharp]  view plain copy print ?
  1. using System;   
  2.   
  3. using System.Text;   
  4.   
  5. using System.IO;   
  6.   
  7. using System.XML;   
  8.   
  9. class MyBase64Array   
  10.   
  11. {   
  12.   
  13. public static void Main(String[] args)   
  14.   
  15. {   
  16.   
  17. string outputFileName = "test64.XML";   
  18.   
  19. if (args.Length > 0)   
  20.   
  21. outputFileName = args[0]; // file name   
  22.   
  23. // 把数组转换成XML   
  24.   
  25. String[] theArray = {"Rome""New York""Sydney""Stockholm",   
  26.   
  27. "Paris"};   
  28.   
  29. CreateOutput(theArray, outputFileName);   
  30.   
  31. return;   
  32.   
  33. }   
  34.   
  35. private static void CreateOutput(string[] theArray, string filename)   
  36.   
  37. {   
  38.   
  39. // 打开XML writer   
  40.   
  41. XMLTextWriter xmlw = new XmlTextWriter(filename, null);   
  42.   
  43. //使子元素根据 Indentation 和 IndentChar 设置缩进。此选项只对元素内容进行缩进   
  44.   
  45. XMLw.Formatting = Formatting.Indented;   
  46.   
  47. //书写版本为“1.0”的 XML 声明   
  48.   
  49. XMLw.WriteStartDocument();   
  50.   
  51. //写出包含指定文本的注释 。   
  52.   
  53. XMLw.WriteComment("Array to Base64 XML");   
  54.   
  55. //开始写出array节点   
  56.   
  57. XMLw.WriteStartElement("array");   
  58.   
  59. //写出具有指定的前缀、本地名称、命名空间 URI 和值的属性   
  60.   
  61. XMLw.WriteAttributeString("xmlns""x"null"dinoe:msdn-mag");   
  62.   
  63. // 循环的写入array的子节点   
  64.   
  65. foreach(string s in theArray)   
  66.   
  67. {   
  68.   
  69. //写出指定的开始标记并将其与给定的命名空间和前缀关联起来   
  70.   
  71. XMLw.WriteStartElement("x""element"null);   
  72.   
  73. //把S转换成byte[]数组, 并把byte[]数组编码为 Base64 并写出结果文本,要写入的字节数为s总长度的2倍,一个string占的字节数是2字节。   
  74.   
  75. XMLw.WriteBase64(Encoding.Unicode.GetBytes(s), 0, s.Length*2);   
  76.   
  77. //关闭子节点   
  78.   
  79. XMLw.WriteEndElement();   
  80.   
  81. }   
  82.   
  83. //关闭根节点,只有两级   
  84.   
  85. XMLw.WriteEndDocument();   
  86.   
  87. // 关闭writer   
  88.   
  89. XMLw.Close();   
  90.   
  91. // 读出写入的内容   
  92.   
  93. XMLTextReader reader = new XmlTextReader(filname);   
  94.   
  95. while(reader.Read())   
  96.   
  97. {   
  98.   
  99. //获取节点名为element的节点   
  100.   
  101. if (reader.LocalName == "element")   
  102.   
  103. {   
  104.   
  105. byte[] bytes = new byte[1000];   
  106.   
  107. int n = reader.ReadBase64(bytes, 0, 1000);   
  108.   
  109. string buf = Encoding.Unicode.GetString(bytes);   
  110.   
  111. Console.WriteLine(buf.Substring(0,n));   
  112.   
  113. }   
  114.   
  115. }   
  116.   
  117. reader.Close();   
  118.   
  119. }   
  120.   
  121. }   


73、.NETXML 操作全解析 本文全面解析了在 .NET 中进行 XML 操作的各种方法,涵盖 XML 节点属性的读取、文档验证、数据写入以及 DOM 的使用。通过示例代码,详细介绍了 XmlTextReader、XmlValidatingReader、XmlTextWriterXmlDocument 等核心类的使用场景及技巧。同时,还结合一个图书管理系统的实际案例,说明如何在开发中应用这些 XML 操作技术。文章最后展望了 .NETXML 操作的未来发展趋势,帮助开发者更好地理解和掌握 XML 处理方法。 阅读详情

相关推荐

xml文件生成类XmlTextWriter的使用

xml文件生成类XmlTextWriter的使用: <?xml version="1.0" encoding="gb2312"?> <Patient> <TestID>201603150001</TestID> <Username>爵士乐</Username> <Name>Cecil Taylor</Name> <Sex>女</Sex> <BirthDate>1988/10/7</BirthDate> <IdNumber>11233219990909999X</IdNumber> <Nation></Nation> <CardAddr>Nefertiti, The Beautiful One Has Come</CardAddr> <Age></Age> <Height>176.5</Height> <Weight>75.6</Weight> </Patient>

C#使用XmlTextReader和XmlTextWriter格式化Xml字符串

C#使用XmlTextReader和XmlTextWriter格式化Xml字符串,使得Xml字符串美观, 即增加换行和缩进。

ylq1045的专栏 1638

C#中XmlTextWriter读写xml文件详细介绍

.NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单。在这篇文章中,我将给出这样的一个类的使用示例,这个类就是XmlTextWriter

XmlTextWriter学习笔记

原本想基于XmlDocument自己写一个Xml编写器,但却发觉状态维护实在麻烦。在阅读《Applied Xml Programming for Microsoft .Net》时,意外发现XmlTextWriter的优越性,于是决定直接使用它进行开发。 XmlWriter与XmlTextWriter的区别 一开始我认为既然XmlTextWriter可以用,那XmlWriter也一定可以...

weixin_34137799的博客 244

C# XML基本操作

XML

钢铁男儿 1117

创建XML的三种方式(二)

本文介绍了在winform中使用C#开发语言来创建XML文档的三种方式,并介绍了各自的优缺点。 方法1是使用`XmlDocument`创建XML文档,方法2是使用`XmlTextWriter`编写XML文档,方法3是使用`LINQ to XML`的Document类生成XML文档。

weixin_40314351的博客 6139

xml文件读取和写入的实现方式小结

xml文件的读取和写入主要又两种,一种是XMLDocument,另一种是XMLtextwriter/xmltextreader。 1、XMLtextwriter/xmltextreader        读取程序:              string path="myxml.xml";             string str = "";             XmlText

happy_rita的专栏 9963

转:xml的读写

1) XML是一项热门的技术。它之所以能够引起人们的兴趣,一个主要的原因在于它十分的简单,人们可以很容易地理解和使用它。每一个程序员都能轻易地看懂一个XML文件,理解它包含的内容。 .NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单。在这篇文章中,我将给出这样的一个类的使用示例,这个类就是XmlTextWriter类。 XmlTextWr...

80

读取XML文件(转)

.NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单。在这篇文章中,我将给出这样的一个类的使用示例,这个类就是XmlTextWriter类。 XmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML。为了使用这个类,你必须首先创建一个新的XmlTextWriter对象,然后你可以...

weixin_30477293的博客 90

ASP.NET操作XML

using System.Xml; 初始化一个xml实例 XmlDocument xml=new XmlDocument(); 导入指定xml文件 xml.Load(path); xml.Load(HttpContext.Current.Server.MapPath("../7in10.xml")); 指定一个节点 XmlNode root=xml.SelectSingleNode(

621

(转载)解析.Net框架下的XML编程技术

cdd1012的专栏 433

XML专题文章收集整理 解析.Net框架下的XML编程技术

XML是微软.Net战略的一个重要组成部分,而且它可谓是XMLWeb服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了。本文将指导大家如何运用C#语言完成.Net框架下的XML文档的读写操作。首先,我会向大家介绍.Net框架中与XML相关的命名空间和其中的重要类。其次,我还会给出有关的实例以使读者更进一步的了解XML文档的读写操作的具体方法。二.XML命名空间和相关...

weixin_30834019的博客 61

C#中XmlTextWriter读写xml文件详细介绍(转)

转自http://www.jb51.net/article/35230.htm .NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单。在这篇文章中,我将给出这样的一个类的使用示例,这个类就是XmlTextWriterXmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处...

weixin_34419326的博客 264

xml增,删,改,查

XML是一项热门的技术。它之所以能够引起人们的兴趣,一个主要的原因在于它十分的简单,人们可以很容易地理解和使用它。每一个程序员都能轻易地看懂一个XML文件,理解它包含的内容。.NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单。在这篇文章中,我将给出这样的一个类的使用示例,这个类就是XmlTextWriter类。XmlTextWriter类允许你将

kiss0622的专栏 465

.net操作xml

XML是一项热门的技术。它之所以能够引起人们的兴趣,一个主要的原因在于它十分的简单,人们可以很容易地理解和使用它。每一个程序员都能轻易地看懂一个XML文件,理解它包含的内容。.NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单。在这篇文章中,我将给出这样的一个类的使用示例,这个类就是XmlTextWriter类。XmlTextWriter类允许你将XML

windy123_1984 1446

C#如何读写xml文件

 XML是一项热门的技术。它之所以能够引起人们的兴趣,一个主要的原因在于它十分的简单,人们可以很容易地理解和使用它。每一个程序员都能轻易地看懂一个XML文件,理解它包含的内容。.NET中包含了很多支持XML的类,这些类使得程序员使用XML编程就如同理解XML文件一样简单。在这篇文章中,我将给出这样的一个类的使用示例,这个类就是XmlTextWriter类。XmlTextWriter类允

刘老实 5967

解析.Net框架下的XML编程技术

一.前言: XML是微软.Net战略的一个重要组成部分,而且它可谓是XML Web服务的基石,所以掌握.Net框架下的XML技术自然显得非常重要了。本文将指导大家如何运用C#语言完成.Net框架下的XML文档的读写操作。首先,我会向大家介绍.Net框架中与XML相关的命名空间和其中的重要类。其次,我还会给出有关的实例以使读者更进一步的了解XML文档的读写操作的具体方...

weixin_30883271的博客 80
上一篇: xml规范介绍
下一篇: XML与.NET
welkin_zxj
博客等级 码龄14年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值