C#中读取XML文件方法

C#中读取XML文件方法

  • XML
    • 简介
    • 格式
  • c#读取XML文件方法
    • 使用XmlDocument
      • 操作
      • 注意
        • 解决方法:
    • 使用XmlTextReader/XmlTextWriter
      • 操作
    • 使用Linq to Xml
      • 操作
    • 使用DataSet
      • 操作

XML

简介

Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。

格式

实例:

文件名:test.xml


<notes>
	<note Type="1">
      <to>Toveto>
      <from>Janifrom>
      <heading>Reminderheading>
      <body>Don't forget me this weekend!body>
    note>
    <note Type="2">
      <to>Toveto>
      <from>Janifrom>
      <heading>Reminderheading>
      <body>Don't forget me this weekend!body>
    note>
notes>

c#读取XML文件方法

使用XmlDocument

使用XmlDocument是一种基于文档结构模型的方式来读取XML文件.在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树.最开始的一个结点叫作根结点,每个结点都可以有自己的子结点.得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性.例如:

 xn 代表一个结点
 xn.Name;//这个结点的名称 
 xn.Value;//这个结点的值 
 xn.ChildNodes;//这个结点的所有子结点 
 xn.ParentNode;//这个结点的父结点 
 .......

操作

//声明XmlDocument对象,并加载XML文件
XmlDocument doc = new XmlDocument();
doc.Load(@"test.xml"); //此处为XML文件的路径

#region 获取节点
//得到根节点node
XmlNode xn = doc.SelectSingleNode("notes");
//得到根节点的所有子节点
XmlNodeList xnl = xn.ChildNodes;

foreach (XmlNode xNode in xnl)
{
    //将节点转换为元素,便于得到节点的属性值
    XmlElement xe = (XmlElement)xNode;
    //得到note节点的属性值
    string noteType = xe.GetAttribute("Type").ToString();
    //得到note节点的所有子节点
    XmlNodeList xnl0 = xe.ChildNodes;
    string body = xnl0.Item(3).InnerText;
    //修改节点值
    xnl0.Item(0).InnerText = "Tovv";
}
#endregion

#region 增加节点 -- 以下是追加
//创建一个节点,并设置节点的属性
XmlElement xelKey = doc.createElement_x("note");
XmlAttribute xelType = doc.CreateAttribute("Type");
xelType.InnerText = "3";
xelKey.SetAttributeNode(xelType);
//创建子节点
XmlElement xelAuthor = doc.createElement_x("to");
xelAuthor.InnerText = "Tang";
xelKey.AppendChild(xelAuthor);
//note,并保存整个文件
xn.AppendChild(xelKey);
doc.Save(@"..\..\Book.xml");
#endregion
    
#region 增加节点 -- 以下是覆盖
XmlDocument doc = new XmlDocument();
doc.LoadXml("");//用这句话,会把以前的数据全部覆盖掉,只有你增加的数据
#endregion

#region 删除节点
XmlElement xe = xmlDoc.DocumentElement; 
string strPath = string.Format("/notes/notes[@Type=\"{0}\"]", dgvBookInfo.CurrentRow.Cells[1].Value.ToString());
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点. 
selectXe.ParentNode.RemoveChild(selectXe); //移除节点
#endregion
    

注意

当XML文件中含有注释时,则会出错,因为注释也是一种结点类型,在没有特别说明的情况下,会默认它也是一个结点(Node).所以在把结点转换成元素的时候就会报错.“无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”。”

解决方法:

XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释 
XmlReader reader = XmlReader.Create(@"..\..\Book.xml", settings);
xmlDoc.Load(reader);

//最后读取完毕后,记得要关掉reader
reader.Close();

使用XmlTextReader/XmlTextWriter

使用XmlTextReader读取数据的时候,首先创建一个流,然后用read()方法来不断的向下读,根据读取的结点的类型来进行相应的操作.

操作

//使用XmlTextReader读文件
XmlTextReader reader = new XmlTextREADER(@"test.xml");

while(reader.Read())
{
    if(reader.NodeType == XmlNodeType.Element)
    {
        //读取节点属性
        if(reader.Name == "note")
        {
            //第一种方法
            string nodeType = reader.GetAttribute(0);
            
            //另一种方法
            for(int i = 0; i < reader.AttributeCount; i++)
            {
                reader.MoveToAttribute(i);
                string str = "属性:" + reader.Name + "=" + reader.Value;
            }
        }
        //读取节点的值
        if(reader.Name == "to")
        {
        	string nodeTo = reader.ReadElementString().Trim();    
        }
        if(reader.Name == "from")
        {
            string nodeFrom = reader.ReadElementString().Trim();
        }
        //当节点类型为尾节点时
        if(reader.NodeType == XmlNodeType.EndElement)
        {
            
        }
    }
}

reader.Close(); //关闭读文件流


//使用XmlTextWriter写文件
//XmlTextWriter写文件的时候,默认是覆盖以前的文件,如果此文件名不存在,它将创建此文件
XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"test.xml", null);
//使用 Formatting 属性指定希望将 XML 设定为何种格式。 这样,子元素就可以通过使用 Indentation 和 IndentChar 属性来缩进。 
myXmlTextWriter.Formatting = Formatting.Indented;

myXmlTextWriter.WriteStartDocument(false);
myXmlTextWriter.WriteStartElement("notes"); //写入notes的起始节点

myXmlTextWriter.WriteComment("note information"); //写入注释
myXmlTextWriter.WriteStartElement("note"); //写入note的起始节点

myXmlTextWriter.WriteAttributeString("Type", "3"); //写入note节点的属性

myXmlTextWriter.WriteElementString("to","hong"); //写入note子节点

myXmlTextWriter.WriteEndElement(); //写入note的尾节点
myXmlTextWriter.WriteEndElement(); //写入notes的尾节点

myXmlTextWriter.Flush(); //结束写入
myXmlTextWriter.Close(); //关闭写入流

使用Linq to Xml

Linq是C#3.0中出现的一个新特性,使用它可以方便的操作许多数据源,也包括XML文件.使用Linq操作XML文件非常的方便,而且也比较简单

操作

XElement xe = XElement.Load(@"test.xml");

#region 读取数据
IEnumerable<XElement> elements = from ele in xe.Elements("note") select ele;

foreach(var ele in elements)
{
    //获取节点的属性
	string nodeType = ele.Attribute("Type").Value;
    //获取节点的子节点值
    string nodeTo = ele.Element("to").Value;
}
#endregion

#region 插入数据
XElement record = new XElement(
	new XElement("note",
                 new XAttribute("Type", "3"),
                 new XElement("to", "tang"),
                 new XElmeent("from", "hong")
                )
);
xe.Add(record);
xe.Save(@"test.xml");
#endregion
    
#region 删除数据
//删除选中的数据
IEnumerable<XElement> elements = from ele in xe.Elements("note")
    where (string)ele.Attribute("Type") == 1
    select ele;

if(elements.Count() > 0)
    elements.First().Remove();

xe.Save(@"test.xml");

//删除所有的数据
IEnumerable<XElement> elements = from ele in xe.Elements("note") select ele;

if(elements.Count() > 0)
    elements.Remove();

xe.Save(@"test.xml");
#endregion

#region 修改数据
IEnumerable<XElement> elements = from ele in xe.Elements("note")
    where (string)ele.Attribute("Type") == 1
    select ele;

if(elements.Count() > 0)
{
    XElement first = elements.First();
    //设置新的属性
    first.SetAttributeValue("Type", 5);
    //替换新的节点
    first.ReplaceNodes(
        new XElement("to", "tangtang"),
        new XElmeent("from", "hong")
    );
}
xe.Save(@"test.xml");
#endregion

使用DataSet

ADO.NET对XML提供了强大的支持,其主要事通过数据集与XML进行交互。

操作

DataSet ds = new DataSet();
//读取文件
ds.ReadXml(@"test.xml");

//显示数据
string nodeTo = ds.Tables[0].Rows[0]["to"];
//修改数据
ds.Talbes[0].Rows[0]["to"] = "tos";
//插入数据
DataRow dr = ds.Tables[0].NewRow();
dr["to"] = "dsds";
dr["from"] = "wang";
ds.Tables[0].Rows.Add(dr);
//删除数据
DataRow delR = ds.Tables[0].Rows[0];
ds.Tables[0].Rows.Remove(delR);

//保存数据
ds.WriteXml(@"test.xml");

你可能感兴趣的:(.NET,c#,xml)