Chinaunix首页 | 论坛 | 博客
  • 博客访问: 174595
  • 博文数量: 89
  • 博客积分: 30
  • 博客等级: 民兵
  • 技术积分: 565
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-24 10:16
文章分类

全部博文(89)

文章存档

2013年(1)

2012年(1)

2011年(8)

2010年(45)

2009年(34)

我的朋友

分类: C/C++

2009-09-17 10:11:56

C#读写XML文件

**************************** phone.xml ****************************



 
  加菲尔德 
  5555555
  纽约
  26/10/1978
 

 
  迈克
  6666666
  纽约
  12/02/1978
 

*********************************************************************

·使用Document读取及写入XML方法

  private void xmlfun()
  {
   XmlDocument doc = new XmlDocument();
   doc.Load(Server.MapPath("phone.xml"));

   XmlElement node = doc.CreateElement("phone");
   XmlAttribute atr = doc.CreateAttribute("id");
   atr.InnerText = "003";
   node.Attributes.Append(atr);

   XmlNode xnode = (XmlNode)doc.CreateElement("Name");
   xnode.InnerText="testName";
   node.AppendChild(xnode);

   xnode = (XmlNode)doc.CreateElement("Number");
   xnode.InnerText="119";
   node.AppendChild(xnode);
   xnode = (XmlNode)doc.CreateElement("City");
   xnode.InnerText="cs";
   node.AppendChild(xnode);
   xnode = (XmlNode)doc.CreateElement("DateOfBirth");
   xnode.InnerText="12/02/1978";
   node.AppendChild(xnode);
   doc.DocumentElement.InsertAfter(node,doc.DocumentElement.LastChild);

   doc.Save(Server.MapPath("phone1.xml"));   //必须要存为不同的文件

  }

 

·使用XmlTextWriter写入XML方法

  private void xmlwriter()
  {
   XmlTextWriter writer= new XmlTextWriter(Server.MapPath("phone4.xml"),null);
   writer.Formatting = Formatting.Indented;  //缩进格式
   writer.Indentation =4;

   writer.WriteStartDocument();

   writer.WriteStartElement("Person");

   writer.WriteStartAttribute("ID",null);
   writer.WriteString("004");
   writer.WriteEndAttribute();

   writer.WriteStartElement("Name");
   writer.WriteString("testWriterName");
   writer.WriteEndElement();

   writer.WriteStartElement("Number");
   writer.WriteString("88888");
   writer.WriteEndElement();

   writer.WriteStartElement("City");
   writer.WriteString("testWriterCity");
   writer.WriteEndElement();

   writer.Flush();
   writer.Close();

  }

 

·使用XmlTextReader读取XML方法

  private void xmlread()
  {
      XmlTextReader reader = new XmlTextReader(Server.MapPath("phone.xml"));
      while(reader.Read())
      {
          if(reader.LocalName.Equals("Name") || reader.LocalName.Equals("Number"))
      {
      this.Label1.Text += reader.ReadString()+"\t";
  }

 

·作用SqlCommand.ExecuteXmlReader()取得XML

SqlConnecting conn = new SqlConnection(CONNSTR);
SqlCommand cmd = new SqlCommand("select fname from employee for xml auto",conn);
conn.open();
XmlReader reader = cmd.ExecuteXmlReader();
......
################ 所取xml数据格式 #################


......

 

 

 

下面的例子是用C# 在asp.net 中实现对xml的操作,环境是vs2005 , 自己写了一个操作类,然后在使用的时候调用它。

实现:登录用户信息的添加、修改和删除,不使用数据库,只在本地存放一个xml文件。

时间:2007年12月21日

下面是User.xml文件的格式,放在网站跟目录中,本例只为实现操作xml的功能,所以登录密码没有加密,在实际应用中,你应该考虑这个问题。同时,这个文件应该赋予写入的权限,这点比较容易疏漏。

 



 
    001
    操作员1
    111
 

 
    002
    操作员2
    222
 


下面我们开始编码,首先vs2005中创建asp.net 网站,选择c#语言

新建一个web窗体,放上三个textbox,三个button,暂时不用改名字,为了方便大家(以及我懒)这个例子中没有改控件的名字(脸红)。

 接着新建项目--类,取名为XmlRW.cs,存放到app_Code文件夹中

在最上部加上对xml的using  : using System.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;

/**////


/// Xml文件的读写类
///

///
public class XmlRW
...{
    public XmlRW()
    ...{
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }

/**/////  大家注意 我们下面的内容在这里写

}

然后,我们开始写三个方法,来完成对xml文件记录的增加,修改和删除,也就是对UserCode,UserName,NamePwd的操作。代码如下:

 

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;

/**////


/// Xml文件的读写类
///

///
public class XmlRW
...{
    public XmlRW()
    ...{
        //
        // TODO: 在此处添加构造函数逻辑
        //
    }
   
    //WriteXml 完成对User的添加操作
    //FileName 当前xml文件的存放位置
    //UserCode 欲添加用户的编码
    //UserName 欲添加用户的姓名
    //UserPassword 欲添加用户的密码

    public void WriteXML(string FileName,string UserCode,string UserName,string UserPassword)
    ...{
   
        //初始化XML文档操作类
        XmlDocument myDoc = new XmlDocument();
        //加载XML文件
        myDoc.Load(FileName);

        //添加元素--UserCode
        XmlElement ele = myDoc.CreateElement("UserCode");
        XmlText text = myDoc.CreateTextNode(UserCode);

        //添加元素--UserName
        XmlElement ele1 = myDoc.CreateElement("UserName");
        XmlText text1 = myDoc.CreateTextNode(UserName);

        //添加元素--UserPwd
        XmlElement ele2 = myDoc.CreateElement("UserPwd");
        XmlText text2 = myDoc.CreateTextNode(UserPassword);

        //添加节点 User要对应我们xml文件中的节点名字
        XmlNode newElem = myDoc.CreateNode("element", "User", "");

        //在节点中添加元素
        newElem.AppendChild(ele);
        newElem.LastChild.AppendChild(text);
        newElem.AppendChild(ele1);
        newElem.LastChild.AppendChild(text1);
        newElem.AppendChild(ele2);
        newElem.LastChild.AppendChild(text2);

        //将节点添加到文档中
        XmlElement root = myDoc.DocumentElement;
        root.AppendChild(newElem);

        //保存
        myDoc.Save(FileName);
       
    }

    //DeleteNode 完成对User的添加操作
    //FileName 当前xml文件的存放位置
    //UserCode 欲添加用户的编码

    public void DeleteNode(string FileName, string UserCode)
    ...{
        //初始化XML文档操作类
        XmlDocument myDoc = new XmlDocument();
        //加载XML文件
        myDoc.Load(FileName);

        //搜索指定某列,一般是主键列
        XmlNodeList myNode = myDoc.SelectNodes("//UserCode");

        //判断是否有这个节点

        if (!(myNode == null))
        ...{
            //遍历节点,找到符合条件的元素

            foreach (XmlNode  xn in myNode)
            ...{
                if (xn.InnerXml  == UserCode)
                    //删除元素的父节点
                    xn.ParentNode.ParentNode.RemoveChild(xn.ParentNode);
            }
        }

        //保存
        myDoc.Save(FileName);

    }

    //WriteXml 完成对User的修改密码操作
    //FileName 当前xml文件的存放位置
    //UserCode 欲操作用户的编码
    //UserPassword 欲修改用户的密码

    public void UpdateXML(string FileName, string UserCode, string UserPassword)
    ...{

        //初始化XML文档操作类
        XmlDocument myDoc = new XmlDocument();
        //加载XML文件
        myDoc.Load(FileName);

        //搜索指定的节点
        System.Xml.XmlNodeList nodes = myDoc.SelectNodes("//User");

        if (nodes != null)
        ...{
            foreach (System.Xml.XmlNode xn in nodes)
            ...{
                if (xn.SelectSingleNode("UserCode").InnerText == UserCode)
                ...{
                    xn.SelectSingleNode("UserPwd").InnerText = UserPassword;
                }

            }
        }

        myDoc.Save(FileName);

    }

}

Ok!这样操作xml的类我们就基本搞定了,下面回到一开始我们创建的那个页面上,为三个button加入它们相应的代码,即可超级轻松的实现对登录用户的操作,吼吼~

 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;

public partial class XmlTest1 : System.Web.UI.Page
...{
    protected void Page_Load(object sender, EventArgs e)
    ...{

    }

    protected void Button1_Click(object sender, EventArgs e)
    ...{

        //添加引用,创建实例
        XmlRW myXml = new XmlRW();
        //调用我们实现定义好的方法,对应传入各个参数
        myXml.WriteXML(Server.MapPath("YtConfig.xml"), TextBox1.Text, TextBox2.Text, TextBox3.Text);

        Response.Write("Save OK!");

    }
    protected void Button2_Click(object sender, EventArgs e)
    ...{
        XmlRW myXml = new XmlRW();
        myXml.DeleteNode(Server.MapPath("YtConfig.xml"), TextBox1.Text );

        Response.Write("Delete OK!");

    }
    protected void Button3_Click(object sender, EventArgs e)
    ...{
        XmlRW myXml = new XmlRW();
        myXml.UpdateXML(Server.MapPath("YtConfig.xml"), TextBox1.Text, TextBox3.Text );

        Response.Write("Update OK!");

    }
}

运行测试,在textbox1中输入用户编码,在textbox2中填入用户名称,在textbox3中填入登录密码,点击button1完成添加....注意xml要事先先建好才行,其它略同.


文章出处:

 
 
XML是目前最常用的通用数据传输与处理接口类型。本文介绍如何用C#.NET读写XML文档资料。
















XML概念
Root XML根节点,只能且必须有一个(以上为LinkLibrary)
Element 节点元素(如Link)
Attribute 节点属性(如Cat, Url, Desc)
Content 内容(非空白文本、CDATA、Element、EndElement、EntityReference 或 EndEntity)节点



System.Xml空间
以下类适合快速流式读写XML文件(注:DOM适合随机读写)
XmlReader, XmlWriter,
XmlTextReader, XmlTextWriter
XmlValidatingReader, XmlValidatingWriter 添加了DTD和模式验证,因此提供了数据的有效性验证
XmlNodeReader, XmlNodeWriter 把XmlNode作为其源


节点类型(public enum XmlNodeType)
XmlDeclaration XML 声明(例如,)。
Attribute 属性(例如,id="123")。
CDATA CDATA 节(例如,)。
Comment 注释(例如,
Document 作为文档树的根的文档对象提供对整个 XML 文档的访问。
DocumentFragment 文档片段。
DocumentType 由以下标记指示的文档类型声明(例如,)。
Element 元素(例如,)。
EndElement 末尾元素标记(例如,
)。
Entity 实体声明(例如,)。
EndEntity 由于调用 ResolveEntity 而使 XmlReader 到达实体替换的末尾时返回。
EntityReference 实体引用(例如,#)。
None 如果未调用 Read 方法,则由 XmlReader 返回。
Notation 文档类型声明中的表示法(例如,)。
ProcessingInstruction 处理指令(例如,)。
SignificantWhitespace 混合内容模型中标记间的空白或 xml:space="preserve" 范围内的空白。
Text 节点的文本内容。
Whitespace 标记间的空白。



------------------------------------------------------------------------
使用XmlTextReader快速读取
------------------------------------------------------------------------
创建
打开 XmlTextReader reader = new XmlTextReader("*.xml");
关闭 reader.Close();

属性
常用
HasAttributes 获取一个值,该值指示当前节点是否有任何属性。(从 XmlReader 继承。)
HasValue 获取一个值,该值指示当前节点是否可以具有非 String.Empty 的 Value。
AttributeCount 获取当前节点上的属性数。
Value 获取当前节点的文本值。
ValueType 获取当前节点的公共语言运行库 (CLR) 类型。(从 XmlReader 继承。)
Name 获取当前节点的限定名。
其它
BaseURI 获取当前节点的基 URI。
CanReadBinaryContent 获取一个值,该值指示 XmlTextReader 是否实现二进制内容读取方法。
CanReadValueChunk 获取一个值,该值指示 XmlTextReader 是否实现 ReadValueChunk 方法。
CanResolveEntity 获取一个值,该值指示此读取器是否可以分析和解析实体。
Depth 获取 XML 文档中当前节点的深度。
Encoding 获取文档的编码方式。
EntityHandling 获取或设置一个值,该值指定读取器如何处理实体。
EOF 获取一个值,该值指示读取器是否定位在流的结尾。
IsDefault 获取一个值,该值指示当前节点是否是从 DTD 或架构中定义的默认值生成的属性。
IsEmptyElement 获取一个值,该值指示当前节点是否为空元素(例如,)。
Item 当在派生类中被重写时,获取此属性的值。(从 XmlReader 继承。)
LineNumber 获取当前行号。
LinePosition 获取当前行位置。
LocalName 获取当前节点的本地名称。
Namespaces 获取或设置一个值,该值指示是否进行命名空间支持。
NamespaceURI 获取读取器定位在的节点的命名空间 URI(采用 W3C 命名空间规范中定义的形式)。
NameTable 获取与此实现关联的 XmlNameTable。
NodeType 获取当前节点的类型。
Normalization 获取或设置一个值,该值指示是否正常化空白和属性值。
Prefix 获取与当前节点关联的命名空间前缀。
ProhibitDtd 获取或设置一个值,该值指示是否允许 DTD 处理。
QuoteChar 获取用于括起属性节点值的引号字符。
ReadState 获取读取器的状态。
SchemaInfo 获取作为架构验证结果分配给当前节点的架构信息。(从 XmlReader 继承。)
Settings 获取用于创建此 XmlTextReader 实例的 XmlReaderSettings 对象。
WhitespaceHandling 获取或设置一个值,该值指定如何处理空白。
XmlLang 获取当前 xml:lang 范围。
XmlResolver 设置用于解析 DTD 引用的 XmlResolver。
XmlSpace 获取当前 xml:space 范围。

方法
定位
MoveToAttribute 移动到指定的属性。
MoveToContent 检查当前节点是否是内容节点, 如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。
MoveToElement 移动到包含当前属性节点的元素
MoveToFirstAttribute 移动到第一个属性
MoveToNextAttribute 移动到下一个属性
Skip 跳过当前节点的子级。
IsStartElement 测试当前内容节点是否是开始标记。

基本读取
Read 读取一个节点
ReadString 将元素或文本节点的内容读取为一个字符串。


读取特定类型
ReadBase64 对 Base64 进行解码并返回解码的二进制字节。
ReadBinHex 对 BinHex 进行解码并返回解码后的二进制字节
ReadChars 将元素的文本内容读入字符缓冲区。通过连续调用此方法,可以读取大的嵌入文本流。
ReadValueChunk 读取嵌入在 XML 文档中的大量文本流。 (从 XmlReader 继承。)
ReadInnerXml 将内部XML节点内容读到一个字符串中
ReadOuterXml 所有XML节点内容(包括自身节点)

读取节点
ReadStartElement 检查当前节点是否为元素并将读取器推进到下一个节点。
ReadElementString 这是一个用于读取简单纯文本元素的 Helper 方法。
ReadAttributeValue 将属性值分析为一个或多个 Text、EntityReference 或 EndEntity 节点
ReadEndElement 检查当前内容节点是否为结束标记并将读取器推进到下一个节点。
GetAttribute 获取属性的值。

读取内容并转化
ReadContentAs... 将内容作为指定类型的对象读取。 (从 XmlReader 继承。)
ReadElementContentAs... 读取当前元素,并将内容作为指定类型的对象返回。 (从 XmlReader 继承。)

追溯读取
ReadToFollowing 一直读取,直到找到具有指定限定名的元素
ReadToDescendant 让 XmlReader 前进到下一个匹配的子代元素。
ReadToNextSibling 让 XmlReader 前进到下一个匹配的同级元素。
GetRemainder 获取已缓冲的 XML 剩余部分。
ReadSubtree 返回新的 XmlReader 实例,此实例可用于读取当前节点及其所有子节点。

------------------------------------------------------------------------
使用XmlTextWriter快速写入
------------------------------------------------------------------------
开闭
XmlTextWriter writer = new XmlTextWriter(@"c:\mywriter.xml", null);
writer.Close();

起止XML文档 (
writer.WriteStartDocument();
writer.EndDocument();

声明XML格式
writer.Formatting = Formatting.Indented;
writer.Indentation = 缩进字符数
writer.IndentChar = 缩进字符
writer.QuoteChar = 单引号|双引号

输出注释 ()
writer.WriteComment("comment text");

输出元素 (ElementVal)
writer.WriteElementString("Element", "ElementVal");
或者
writer.StartElement("Element");
writer.WriteString("ElementVal");
writer.EndElement();

输出元素属性 (ElementVal)
writer.StartElement("Element");
writer.WriteAttributeString("Property", "PropertyVal");
writer.WriteString("ElementVal");
writer.EndElement();

输出CDATA (....
WriteCData("....")

输出字符缓冲区文本
WriteChars(char[], startPos, length)



------------------------------------------------------------------------
读例程
------------------------------------------------------------------------
XML文件



The Handmaid"s Tale
19.95


Pride And Prejudice
24.95




取每个书节点上的ISBN属性
using (XmlReader reader = XmlReader.Create("books.xml"))
{
reader.ReadToFollowing("book");
do {
Console.WriteLine("ISBN: {0}", reader.GetAttribute("ISBN"));
} while (reader.ReadToNextSibling("book"));
}

跳到子节点
using (XmlReader reader = XmlReader.Create("2books.xml"))
{
reader.MoveToContent(); // bookstore
reader.ReadToDescendant("book"); // 第一个book
reader.Skip(); //Skip the first book. // 第二个book
...
}

挖到子节点
using (XmlReader reader = XmlReader.Create("book3.xml"))
{
reader.Read();
reader.ReadStartElement("book");
reader.ReadStartElement("title");
Console.WriteLine("The content of the title element: {0}", reader.ReadString());
reader.ReadEndElement();
reader.ReadStartElement("price");
Console.WriteLine("The content of the price element: {0}", reader.ReadString());
reader.ReadEndElement();
reader.ReadEndElement();
}



读到指定位置
FileStream fs = new FileStream("..\\..\\..\\books.xml", FileMode.Open);
XmlTextReader tr = new XmlTextReader(fs);
while(!tr.EOF)
{
// 查找类型为XmlNodeType.Element和名称为title的节点
if(tr.MoveToContent() == XmlNodeType.Element && tr.Name=="title")
{
listBox1.Items.Add(tr.ReadElementString());
}
else
{
tr.Read();
}
}

遍历元素属性
string fileName = "..\\..\\..\\books.xml";
XmlTextReader tr = new XmlTextReader(fileName);
while(tr.Read())
{
//check to see if it"s a NodeType element
if(tr.NodeType == XmlNodeType.Element)
{
//if it"s an element, then let"s look at the attributes.
for(int i = 0; i < tr.AttributeCount; i++) {
listBox1.Items.Add(tr.GetAttribute(i));
}
}


------------------------------------------------------------------------
写例程
------------------------------------------------------------------------
XmlTextWriter writer = new XmlTextWriter (filename, null);

//Use indenting for readability.
writer.Formatting = Formatting.Indented;

//xml声明(Write the XML delcaration. )
writer.WriteStartDocument();

//预处理指示(Write the ProcessingInstruction node.)
String PItext="type="text/xsl" href="book.xsl"";
writer.WriteProcessingInstruction("xml-stylesheet", PItext);

//文档类型(Write the DocumentType node.)
writer.WriteDocType("book", null , null, "");

//注释(Write a Comment node.)
writer.WriteComment("sample XML");

//根元素(Write a root element.)
writer.WriteStartElement("book");

//属性值(Write the genre attribute.)
writer.WriteAttributeString("genre", "novel");

//属性值(Write the ISBN attribute.)
writer.WriteAttributeString("ISBN", "1-8630-014");

//Write the title.
writer.WriteElementString("title", "The Handmaid"s Tale");

//Write the style element.
writer.WriteStartElement("style");
writer.WriteEntityRef("h");
writer.WriteEndElement();

//文本元素节点(Write the price.)
writer.WriteElementString("price", "19.95");

//[CDATA]
writer.WriteCData("Prices 15% off!!");

//Write the close tag for the root element.
writer.WriteEndElement();

writer.WriteEndDocument();

//Write the XML to file and close the writer.
writer.Flush();
writer.Close();

//Load the file into an XmlDocument to ensure well formed XML.
XmlDocument doc = new XmlDocument();
//Preserve white space for readability.
doc.PreserveWhitespace = true;
//Load the file.
doc.Load(filename);

//Display the XML content to the console.
Console.Write(doc.InnerXml);


------------------------------------------------------------------------
带验证的读写
------------------------------------------------------------------------
books.xml




The Autobiography of Benjamin Franklin

Benjamin
Franklin

8.99

...

books.xdr



























cs
using System.Xml.Schema;
protected void button1_Click (object sender, System.EventArgs e)
{
//change this to match your path structure.
string fileName = "..\\..\\..\\booksVal.xml";
XmlTextReader tr = new XmlTextReader(fileName);
XmlValidatingReader trv = new XmlValidatingReader(tr);

//Set validation type
trv.ValidationType=ValidationType.XDR;
//Add in the Validation eventhandler
trv.ValidationEventHandler += new ValidationEventHandler(this.ValidationEvent);

//Read in node at a time
while(trv.Read())
{
if(trv.NodeType == XmlNodeType.Text)
listBox1.Items.Add(trv.Value);
}
}
public void ValidationEvent (object sender, ValidationEventArgs args)
{
MessageBox.Show(args.Message);
}
 
 
 

xml文件如下:



 123
 456
 789
 123
 467

利用C#读写代码如下

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Windows.Forms;

namespace WindowsApplication1
{
    class XmlOperator
    {
        private string xmlPath;
        private XmlDocument myDc=new XmlDocument();
        ///


        /// 装载配置文件
        ///

        /// 配置文件的路径
        public XmlOperator(string Path)
        {
            xmlPath = Path;
            try
            {
                myDc.Load(xmlPath);
            }
            catch
            {
                MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                Application.Exit();
            }
        }
        ///
        /// 将配置文件中的值读入
        ///

        public void GetXmlReader()
        {
            PublicData.DBPath = myDc.SelectSingleNode("system").SelectSingleNode("DBPath").InnerText;
            PublicData.BackPicturePath = myDc.SelectSingleNode("system").SelectSingleNode("BackPicturePath").InnerText;
            PublicData.MIDPath = myDc.SelectSingleNode("system").SelectSingleNode("MIDPath").InnerText;
            PublicData.DBName = myDc.SelectSingleNode("system").SelectSingleNode("DBName").InnerText;
            PublicData.DBPassword = myDc.SelectSingleNode("system").SelectSingleNode("DBPassword").InnerText;
        }
        ///
        /// 将自己的设置写入配置文件
        ///

        ///
        public void SetXmlFile()
        {
            myDc.SelectSingleNode("system").SelectSingleNode("DBPath").InnerText = PublicData.DBPath;
            myDc.SelectSingleNode("system").SelectSingleNode("BackPicturePath").InnerText = PublicData.BackPicturePath;
            myDc.SelectSingleNode("system").SelectSingleNode("MIDPath").InnerText = PublicData.MIDPath;
            myDc.SelectSingleNode("system").SelectSingleNode("DBName").InnerText = PublicData.DBName;
            myDc.SelectSingleNode("system").SelectSingleNode("DBPassword").InnerText = PublicData.DBPassword;
            myDc.Save(xmlPath);
        }
    }
}

 
阅读(846) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~