C#中读取XML文件方法
- XML
- 简介
- 格式
- c#读取XML文件方法
- 使用XmlDocument
- 操作
- 注意
- 解决方法:
- 使用XmlTextReader/XmlTextWriter
- 操作
- 使用Linq to Xml
- 操作
- 使用DataSet
- 操作
XML
简介
Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。
格式
实例:
文件名:
<?xml version="1.0" encoding="UTF-8"?>
<notes>
<note Type="1">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
<note Type="2">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
</notes>
c#读取XML文件方法
使用XmlDocument
使用XmlDocument是一种基于文档结构模型的方式来读取XML文件.在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树.最开始的一个结点叫作根结点,每个结点都可以有自己的子结点.得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其它的一些属性.例如:
xn 代表一个结点 ;//这个结点的名称 ;//这个结点的值 ;//这个结点的所有子结点 ;//这个结点的父结点 .......
操作
//声明XmlDocument对象,并加载XML文件
XmlDocument doc = new XmlDocument();
doc.Load(@""); //此处为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(@"..\..\");
#endregion
#region 增加节点 -- 以下是覆盖
XmlDocument doc = new XmlDocument();
doc.LoadXml("<notes></notes>");//用这句话,会把以前的数据全部覆盖掉,只有你增加的数据
#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).所以在把结点转换成元素的时候就会报错.“无法将类型为“”的对象强制转换为类型“”。”
解决方法:
XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释
XmlReader reader = XmlReader.Create(@"..\..\", settings);
xmlDoc.Load(reader);
//最后读取完毕后,记得要关掉reader
reader.Close();
使用XmlTextReader/XmlTextWriter
使用XmlTextReader读取数据的时候,首先创建一个流,然后用read()方法来不断的向下读,根据读取的结点的类型来进行相应的操作.
操作
//使用XmlTextReader读文件
XmlTextReader reader = new XmlTextREADER(@"");
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(@"", 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(@"");
#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(@"");
#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(@"");
//删除所有的数据
IEnumerable<XElement> elements = from ele in xe.Elements("note") select ele;
if(elements.Count() > 0)
elements.Remove();
xe.Save(@"");
#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(@"");
#endregion
使用DataSet
对XML提供了强大的支持,其主要事通过数据集与XML进行交互。
操作
DataSet ds = new DataSet();
//读取文件
ds.ReadXml(@"");
//显示数据
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(@"");