C#来创建和读取XML文档 [转]

C#来创建和读取XML文档
 【关键词】:XML 

 录入:小鱼之家 来源:http://fisher.xundain.com 时间:2005-3-3 23:41:54 点击:85次

扩展标记语言XML(eXtensible Markup Language),是由W3C组织制定的。做为用于替代HTML语言的一种新型的标记语言,XML内部有着很多基本标准,XML就是通过与这些相关标准地结合,应用于科学计算、电子出版、多媒体制作和电子商务的。C#作为一种新型的程序语言,是.Net框架的一个重要组成部分,他和XML的关系颇深。本文就从一个方面来探讨一下这二者的关系。即:看用C#如何来创建和读取XML文档。

一. 本文程序设计和运行的软件环境:

(一).微软公司视窗2000服务器版

(二)..Net FrameWork SDK Beta 2

二. C#创建XML文档:

在本文中我们来介绍一下用C#创建XML文档的二种方法,这二种方法各有千秋,第一种创建起来更灵活,第二种创建起来更方便。

(一).C#创建XML文档的第一种方法:

这一种方法是按照按照XML的结构一步一步的构建XML文档。C#构建XML文档通过.Net FrameWork SDK中的命名空间"System.Xml"中封装的各种类来实现的。下面就按照一个XML典型文档结构来介绍一下。

(1).首先要创建一个空的XML文档:

在命名空间"System.Xml"中有一个类"XmlDocument",C#通过这个类来描述XML文档。下面是用C#创建一个XML文档。

xmldoc = new System.Xml.XmlDocument ( ) ;


(2).在XML的文档的最头部加入XML的声明段落:

利用"XmlDocument"类中的 "CreateNode" 方法可以创建一个指定类型的XML节点,"CreateNode" 方法的调用方法总共有三种,在本文中使用的其一般的方法,具体语法如下:

XmlDocument.CreateNode Method ( XmlNodeType , String , String )

然后在利用"XmlDocument"类中的"AppendChild"方法在XML文档中加入此节点,用C#在XML文档中加入声明段落实现的语句如下:

xmlnode = xmldoc.CreateNode ( XmlNodeType.XmlDeclaration , "" , "" ) ;
xmldoc.AppendChild ( xmlnode ) ;



(3).为XML文档加入元素(element):

加入数据内容是通过元素,在"XmlDocument"类中提供了二个方法:"CreateElement"和"CreateTextNode"。其中第一个方法是在XML中创建一个元素,另外一个方法是为创建的元素指定文本值。下面是为上面创建的XML文档加入一个根元素。

xmlelem = xmldoc.CreateElement ( "" , "ROOT" , "" ) ;
xmltext = xmldoc.CreateTextNode ( "Root Text" ) ;

注释:其中"xmlelem"是创建的"XmlElement"对象,"xmltext"是"XmlText"对象

有了创建一个XML元素的例子,就可以根据XML文档中数据的不同的结构来创建其他的数据了。

(二).C#创建XML文档的第一种方法的源程序代码(NO1.cs):

using System ;
using System.Xml ;
class MainClass
{
XmlDocument xmldoc ;
XmlNode xmlnode ;
XmlElement xmlelem ;
XmlElement xmlelem2 ;
XmlText xmltext ;
static void Main ( string [ ] args )
{
MainClass app = new MainClass ( ) ;
}
public MainClass ( )
{
xmldoc = new XmlDocument ( ) ;
//加入XML的声明段落
xmlnode = xmldoc.CreateNode ( XmlNodeType.XmlDeclaration , "" , "" ) ;
xmldoc.AppendChild ( xmlnode ) ;
//加入一个根元素
xmlelem = xmldoc.CreateElement ( "" , "ROOT" , "" ) ;
xmltext = xmldoc.CreateTextNode ( "Root Text" ) ;
xmlelem.AppendChild ( xmltext ) ;
xmldoc.AppendChild ( xmlelem ) ;
//加入另外一个元素
xmlelem2 = xmldoc.CreateElement ("SampleElement" ) ;
xmlelem2 = xmldoc.CreateElement ( "" , "SampleElement" , "" ) ;
xmltext = xmldoc.CreateTextNode ( "The text of the sample element" ) ;
xmlelem2.AppendChild ( xmltext ) ;
xmldoc.ChildNodes.Item(1).AppendChild ( xmlelem2 ) ;
//保存创建好的XML文档
try
{
xmldoc.Save ( "c:\\data.xml" ) ;
}
catch ( Exception e )
{
//显示错误信息
Console.WriteLine ( e.Message ) ;
}
Console.ReadLine ( ) ;
}
}


(三).C#创建XML文档的第二种方法:

在介绍完第一种方法以后,我想每一个读者都感觉到用C#创建XML文档是一项比较烦杂的工作了,因为不仅要了解创建的知识,还要了解文档的结构,这样创建的过程就是一步一步的了。下面就来介绍一种比较容易的创建方法,这种创建方法是直接定义XML文档,然后把他保存到文件中就可以了。

(1).创建一个XML文档:

这一点和第一种方法一样,在这里就不介绍了。

(2).通过"XmlDocument"类中的"LoadXml"方法,直接在文档中加入想要加入的XML数据。当然你加入的XML应该符合XML的语法,不然产生的文件也没有什么意义了。下面是加入XML的具体代码:

doc.LoadXml (
"<Employees> " +
"<NO1>" +
"<Name>Ma Jin Hu</Name>" +
"<ZIP> 239000 </ZIP>" +
"<Address>Feng Huang Street</Address>" +
"<City>Chu Zhou City</City>" +
"<State> ANHUI </State>" +
"</NO1>" +
"<NO2>" +
"<Name>Wang Tian</Name>" +
"<ZIP> 239000 </ZIP>" +
"<Address>Lang Ya Street</Address>" +
"<City>He Fei City</City>" +
"<State> ANHUI </State>" +
"</NO2>" +
"<NO3>" +
"<Name>Zou Wen Biao</Name>" +
"<ZIP> 100000 </ZIP>" +
"<Address>Sai Di Street</Address>" +
"<City>Bei Jin City</City>" +
"<State>Bei Jin</State>" +
"</NO3>" +
"</Employees>" ) ;


(3).把保存XML文档到文件中:

保存XML文档是通过"XmlDocument"类中的"Save"方法来实现的。具体如下:

doc.Save ( "data.xml" ) ;


(四).C#创建XML文档的第二种方法的源程序代码(NO2.cs):

using System ;
using System.IO ;
using System.Xml;
public class Sample
{
public static void Main ( )
{
//创建一个XmlDocument对象
XmlDocument doc = new XmlDocument ( ) ;
doc.LoadXml (
"<Employees> " +
"<NO1>" +
"<Name>Ma Jin Hu</Name>" +
"<ZIP> 239000 </ZIP>" +
"<Address>Feng Huang Street</Address>" +
"<City>Chu Zhou City</City>" +
"<State> ANHUI </State>" +
"</NO1>" +
"<NO2>" +
"<Name>Wang Tian</Name>" +
"<ZIP> 239000 </ZIP>" +
"<Address>Lang Ya Street</Address>" +
"<City>He Fei City</City>" +
"<State> ANHUI </State>" +
"</NO2>" +
"<NO3>" +
"<Name>Zou Wen Biao</Name>" +
"<ZIP> 100000 </ZIP>" +
"<Address>Sai Di Street</Address>" +
"<City>Bei Jin City</City>" +
"<State>Bei Jin</State>" +
"</NO3>" +
"</Employees>" ) ;
//保存这个文档到文件中
doc.Save ( "data.xml" ) ;
}
}


用C#创建XML文档的方法其实有很多,在这里只是选取了二种比较典型的方法加以介绍。但无论那一种方法,C#在创建XML的时候都需要用到.Net FrameWork SDK。所以了解并掌握这个类库中的内容对于C#编程是十分必要的,在下面我们将来介绍一下用C#读取XML中的数据,通过这你会发现,C#又是利用这个类库实现这个功能的。

三.C#读取XML文件:

本节将用C#来读取本文中用第二种方法创建的XML文件,编译NO2.cs后,执行将产生"data.xml"文件,其中"data.xml"文件的数据结构如下:

<Employees>
<NO1>
<Name>Ma Jin Hu</Name>
<ZIP> 239000 </ZIP>
<Address>Feng Huang Street</Address>
<City>Chu Zhou City</City>
<State> ANHUI </State>
</NO1>
<NO2>
<Name>Wang Tian</Name>
<ZIP> 239000 </ZIP>
<Address>Lang Ya Street</Address>
<City>He Fei City</City>
<State> ANHUI </State>
</NO2>
<NO3>
<Name>Zou Wen Biao</Name>
<ZIP> 100000 </ZIP>
<Address>Sai Di Street</Address>
<City>Bei Jin City</City>
<State>Bei Jin</State>
</NO3>
</Employees>


在下面的内容中,我们利用C#读取此文件,并用ListView组件按照数据结构给显示出来。下图是读取此XML后的运行界面:

图01:C#读取XML后的运行界面
点击打开新窗口

要正确读取XML数据,首先要了解XML的结构。根据上面的XML文件,可以知道此XML包含三个数据,下面就来看如何读取这三条数据:

(1).装入XML文件,形成数据流:

通过创建一个"XmlDocument"对象,然后利用"load"方法,可以把XML文件装入,具体如下:

XmlDocument doc = new XmlDocument ( ) ;
// 装入指定的XML文档
doc.Load ( "C:\\data.xml" ) ;
(2).读取XML文件,并显示出来:

读取XML是通过创建"XmlNodeReader"对象来实现的,"XmlNodeReader"对象主要是用来可以读取XML的节点数据。在本文的程序中使用到了一些"XmlNodeReader"的属性,譬如"NodeType"属性,用来判断读取得节点是什么类型。"Value"是节点的值。下面是读取XML文件并显示在ListView中的实现代码,其中listview1是已经创建ListView组件:

while ( reader.Read ( ) )
{
//判断当前读取得节点类型
switch ( reader.NodeType )
{
case XmlNodeType.Element :
s = reader.Name ;
break ;
case XmlNodeType.Text :
if ( s.Equals ( "Name" ) )
myItem = Listview1.Items.Add ( reader.Value ) ;
else
myItem.SubItems.Add ( reader.Value ) ;
break ;
}
}


四.C#读取XML的文件的源程序代码(read.cs):

在了解了上面的内容以后,可以得到用C#读取指定XML文件的完整代码,具体如下:

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Xml ;
public class Form1 : Form
{
private Button button1 ;
private ListView Listview1 ;
private System.ComponentModel.Container components = null ;

public Form1 ( )
{
//初始化窗体中的各个组件
InitializeComponent ( ) ;
}
//清除程序中使用过的资源
protected override void Dispose ( bool disposing )
{
if ( disposing )
{
if ( components != null )
{
components.Dispose ( ) ;
}
}
base.Dispose ( disposing ) ;
}
private void InitializeComponent ( )
{
button1 = new Button ( ) ;
Listview1 = new ListView ( ) ;
SuspendLayout ( ) ;

button1.Anchor = ( ( AnchorStyles.Bottom | AnchorStyles.Left )
| AnchorStyles.Right ) ;
button1.Location = new Point ( 240 , 296 ) ;
button1.Name = "button1" ;
button1.Size = new Size ( 112 , 37 ) ;
button1.TabIndex = 0 ;
button1.Text = "读取XML文档" ;
button1.Click += new System.EventHandler ( button1_Click ) ;

Listview1.Anchor = ( ( ( AnchorStyles.Top | AnchorStyles.Bottom )
| AnchorStyles.Left )
| AnchorStyles.Right ) ;
Listview1.GridLines = true ;
Listview1.Location = new Point ( 10 , 9 ) ;
Listview1.Name = "Listview1" ;
Listview1.Size = new Size ( 623 , 269 ) ;
Listview1.TabIndex = 1 ;
Listview1.View = View.Details ;

this.AutoScaleBaseSize = new Size ( 6 , 14 ) ;
this.ClientSize = new Size ( 608 , 348 ) ;
this.Controls.Add ( Listview1 );
this.Controls.Add ( button1 );
this.Name = "Form1" ;
this.StartPosition = FormStartPosition.CenterScreen ;
this.Text = "用C#来读取XML文档" ;
this.ResumeLayout ( false ) ;

}
static void Main ( )
{
Application.Run ( new Form1 ( ) ) ;
}

private void button1_Click ( object sender , System.EventArgs e )
{
ListViewItem myItem = new ListViewItem ( ) ;
// 构建listview组件
Listview1.Columns.Clear ( ) ;
Listview1.Items.Clear ( ) ;
Listview1.Columns.Add ( "Name" , 80 , HorizontalAlignment.Left ) ;
Listview1.Columns.Add ( "Zip" , 80 , HorizontalAlignment.Left ) ;
Listview1.Columns.Add ( "Address" , 80 , HorizontalAlignment.Left ) ;
Listview1.Columns.Add ( "City" , 80 , HorizontalAlignment.Left ) ;
Listview1.Columns.Add ( "State" , 80 , HorizontalAlignment.Left ) ;
XmlNodeReader reader = null ;

try
{
string s = "" ;
XmlDocument doc = new XmlDocument ( ) ;
// 装入指定的XML文档
doc.Load ( "C:\\data.xml" ) ;
// 设定XmlNodeReader对象来打开XML文件
reader = new XmlNodeReader ( doc ) ;
// 读取XML文件中的数据,并显示出来
while ( reader.Read ( ) )
{
//判断当前读取得节点类型
switch ( reader.NodeType )
{
case XmlNodeType.Element :
s = reader.Name ;
break ;
case XmlNodeType.Text :
if ( s.Equals ( "Name" ) )
myItem = Listview1.Items.Add ( reader.Value ) ;
else
myItem.SubItems.Add ( reader.Value ) ;
break ;
}
}
}
finally
{
//清除打开的数据流
if ( reader != null )
reader.Close ( ) ;
}
}
}


五.总结:

C#和XML的渊源是很深的,本文只是从一个侧面反映了二者关系的密切程度。在.Net FrameWork SDK中存在许多可以直接操作XML的类库,掌握这些类库的使用方法,对用C#开发和XML相关程序是十分必要的。
引文自 http://fisher.xundain.com/html/book.asp?art_id=502&cat_id=21

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何成功搞垮一个团队?

阅读本文大概需要3分钟。最近好几个读者聊到是否能写一些怎么带团队的文章&#xff0c;在互联网职场中&#xff0c;升职带团队被大部分职场人视为职业生涯的重大转折点。一方面&#xff0c;升职意味着更丰厚的待遇&#xff0c;另一方面&#xff0c;带团队意味着自己大小变成了一…

Python学习第一天

干程序这行比较辛苦的就是要随时更新自己的知识。闷&#xff5e;&#xff5e;为了让自己能够更加深入的学习GUN和LINUX。在简单了解了shell以后决定学习Python。&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d…

WinForm捕获全局异常(捕获未处理的异常)

背景我们在做WinForm程序的时候&#xff0c;一般都是对异常进行处理&#xff0c;但是&#xff0c;我们要防止不小心出现未知异常&#xff0c;导致软件崩溃。也可采集系统未知的异常信息&#xff0c;防止出现异常&#xff0c;也无法下手。于是就有了如这篇文章标题所述的一个简单…

it's so cold

今晚值日&#xff0c;本来中午不冷的&#xff0c;就换了衬衫&#xff0c;结果傍晚的时候就很凉&#xff0c;吃过晚饭只好回去换了件秋天的棉衫。但晚上我值日的那个地方风很大&#xff0c;熬了一节课&#xff0c;下课学生来打乒乓&#xff0c;借了件他们的校服穿&#xff0c;结…

java 继承 冒号_java继承(extends)简单介绍

继承相信很多人都有听说过&#xff0c;继承是面向对象的三个基本特征之一&#xff0c;下面的话就一起通过简单的文章来对java继承进行一下了解吧。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性&#xff0c;从而减少代码冗余&#xff0c;提高程序运行效率。Java中…

如何在 ASP.NET Core 中写出更干净的 Controller

你可以遵循一些最佳实践来写出更干净的 Controller&#xff0c;一般我们称这种方法写出来的 Controller 为瘦Controller&#xff0c;瘦 Controller 的好处在于拥有更少的代码&#xff0c;更加单一的职责&#xff0c;也便于阅读和维护&#xff0c;而且随着时间的推移也容易做 Co…

探索 .NET团队对API的设计流程

原文作者&#xff1a;steve gordon 原文链接: https://www.stevejgordon.co.uk/how-are-dotnet-apis-designed在这篇文章中&#xff0c;我想介绍一些我觉得非常有趣的东西&#xff0c;.NET 团队是如何设计API的&#xff1f;我们先来看下.NET团队面临的有哪些挑战&#xff0c;您…

静态页面的值传递

1两窗口之间存在着关系.父窗口parent.htm打开子窗口son.htm子窗口可以通过window.opener指向父窗口.这样可以访问父窗口的对象. 优点:取值方便.只要window.opener指向父窗口,就可以访问所有对象. 不仅可以访问值,还可以访问父窗口的方法.值长度无限制.缺点:两窗口要存在着…

java类同步_Java中方法,对象,类的同步

关于在多线程环境中使用同步,我需要一些澄清.我在下面有一个小例子类.但我实际上发现很难做出以下内容如何工作的测试用例;我想要测试用例的原因是要了解同步如何处理这些不同的场景>如果一个线程调用SharedResource.staticMethod,它将获取该类的锁.它是否意味着一个SharedR…

ocelot 中间件的变化

ocelot 中间件的变化Intro之前我们使用 ocelot 的时候自定义了一些中间件来实现我们定制化的一些需求&#xff0c;最近博客园上有小伙伴问我怎么使用&#xff0c;他用的版本是 16.0 版本&#xff0c;16.0 和 17.0 版本的差异不是特别大&#xff0c;就以 17.0 版本为例看一下 oc…

mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值

前言&#xff1a;今天无意在mapper文件中看到useGeneratedKeys这个词&#xff0c;好奇就查了下&#xff0c;发现能解决我之前插入有外键表数据时&#xff0c;这个外键获取繁琐的问题&#xff0c;于是学习敲DEMO记录在项目中经常需要获取到插入数据的主键来保障后续操作&#xf…

Istio 知多少 | 下一代微服务的守护者

1. 引言在写完eShopOnContainers 知多少[12]&#xff1a;Envoy gateways后&#xff0c;就一直想进一步探索Service Mesh&#xff0c;最近刚在极客时间上学完《Service Mesh入门》&#xff0c;又大致浏览了一遍官方文档&#xff0c;对Istio也算有了基本的认识。下面就根据自己的…

微软家也会出错

下图是2006年2月8日微软WebCast首页的截图转载于:https://www.cnblogs.com/mssite/archive/2006/02/08/327130.html

mysql 基础视图_MySQL基础(4) | 视图

MySQL基础(4) | 视图基本语法1.创建CREATE VIEW AS 语法说明如下。&#xff1a;指定视图的名称。该名称在数据库中必须是唯一的&#xff0c;不能与其他表或视图同名。&#xff1a;指定创建视图的 SELECT 语句&#xff0c;可用于查询多个基础表或源视图。对于创建视图中的 SELEC…

C# 中的 null 包容运算符 “!” —— 概念、由来、用法和注意事项

在 2020 年的最后一天&#xff0c;博客园发起了一个开源项目&#xff1a;基于 .NET 的博客引擎 fluss&#xff0c;我抽空把源码下载下来看了下&#xff0c;发现在属性的定义中&#xff0c;有很多地方都用到了 null!&#xff0c;如下图所示&#xff1a;这是什么用法呢&#xff1…

[转]不找情人的七种理由(献给已婚的男人)

献给已婚的男人不找情人的七种理由   好像有个曾一度风靡的短信&#xff0c;“结婚是错误,离婚是觉悟,婚外恋是醒悟,再婚是执迷不悟,没有情人是废物,情人太多是动物。”咱不怕犯错误&#xff0c;可没办法不当废物&#xff0c;三十好几还没混上个情人&#xff0c;想起来就惭…

无法初始化java类_myeclip运行java程序不能初始化类 NoClassDefFoundError

引用 3 楼 Menglinyang 的回复:是就这个项目有问题还是所有的都是这样&#xff1f;package cn.itcast.utils;import java.io.InputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.…

C#学习笔记(十四):StatusBar控件

状态栏控件StatusBar<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />StatusBar的一些常用属性&#xff1a;名称可用性描述BackgroundImage读写可以给状态栏赋予一个图像&#xff0c;显示在背景上。Panels只读这是状态栏上的面板…

微前端架构在容器平台的应用

源宝导读&#xff1a;随着业务的发展&#xff0c;天际-星舟平台未来需要解决与其他云共创共建&#xff0c;跨团队高效协作等诸多问题&#xff0c;而星舟现有的技术架构将难以支撑。本文将介绍星舟平台如何通过向更先进的“微前端”架构演进落地&#xff0c;以应对将来快速增长的…

java八皇后问题穷举算法_穷举法和回溯法解n皇后问题

八皇后问题是一个以国际象棋为背景的问题&#xff1a;如何能够在88的国际象棋棋盘上放置八个皇后&#xff0c;使得任何一个皇后都无法直接吃掉其他的皇后&#xff1f;为了达到此目的&#xff0c;任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇…