xml文件的读取和写入主要又两种,一种是XMLDocument,另一种是XMLtextwriter/xmltextreader。
1、XMLtextwriter/xmltextreader
读取程序:
string path="myxml.xml";
string str = "";
XmlTextReader xtr = new XmlTextReader(path);
///read()这个方法的返回值总是为真,直到到达文件的底部时,返回值才变为假。换句话说, 循环在文件的开始时启动并且读入所有的节点, 一次读入一个节点, 直到到达文件的结尾:
try
{
while(xtr.Read())
///此时,xtr里面有着当前节点的信息也就是从刚刚获得数据的那个节点的信息。也就是xtr.value就是当前元素的值,可以用if(str.name==“”)来获得感兴趣的元素的值
{
switch (xtr.NodeType)
{
case XmlNodeType.Element:
str += "Element:" + xtr.Name;
break;
case XmlNodeType.Text:
str += "Text:" + xtr.Value;
break;
case XmlNodeType.EndElement:
str += "EndElement:" + xtr.Name;
break;
default:
break;
}
}
tb.AppendText(str);
xtr.Close();
}
catch
{
}
当使用NodeType属性时,理解节点怎么联系到XML单元是非常重要的。例如, 看下列 XML元素:
<city>nanjing</city>
XMLtextReader 把这个元素看作 3 个节点,顺序如下:
1.<city>标签被读为类型 XMLNodeType.Element 节点,元素的名字“city”可从 XMLTextReader 的Name属性中获得。
2.文本数据“nanjing”被读为类型为XMLNodeType.Text的节点。数据“nanjing ” 可从XMLTextReader 的Value属性中取得。
3.</city>标签被读为类型为XMLNodeType.EndElement 节点。同样,元素的名称“city”可从XMLTextReader的Name属性中获得。
如果XMLTextReader遇到一个错误, 例如出现违反XML句法的情况,它抛出一个System.XML.XMLException类型的异常。使用这个类的代码应该总是被保护 ( 在Try……Catch块中)。
写入程序:
XmlTextWriter xtw = new XmlTextWriter(path,ASCIIEncoding.ASCII);
xtw.Formatting = Formatting.Indented;
xtw.WriteStartDocument();
xtw.WriteComment("it's happy's first xml file!");
xtw.WriteStartElement("grandfather");
xtw.WriteStartElement("father");
xtw.WriteName("happy");
xtw.WriteValue("happy123");
xtw.WriteElementString("me", "nuaa");
xtw.WriteEndElement();
xtw.WriteEndElement();
xtw.WriteEndDocument();
xtw.Flush();
xtw.Close();
MessageBox.Show("XML文件保存成功!");
2、XMLDOCUMENT
写入程序:
try
{
string path = "happy.xml";
XmlDocument xd = new XmlDocument();
xd.CreateXmlDeclaration("1.0", "utf-8", "yes");
XmlNode root = xd.CreateElement("NUAA");
XmlNode xn = xd.CreateElement("CAE");
XmlAttribute xa = xd.CreateAttribute("name");
xa.Value = "happyhuang";
root.Attributes.Append(xa);
xn.InnerText = "mytest";
XmlNode XN1 = xd.CreateElement("CAE1");
XN1.InnerText = "MYTEST";
xn.AppendChild(XN1);
root.AppendChild(xn);
xd.AppendChild(root);
xd.Save(path);
MessageBox.Show("文件保存成功!");
}
catch
{
MessageBox.Show("文件写入失败!");
}
文件读取:
///在写入程序中,xl.SelectSingleNode("CAE")和xl.Attributes["name"].Value;这里的CAE和name都只会在NUAA的子节点里查找,如果是在子节点中找不到或者是在子节点的子节点,那么就报错,也就是它只会在NUAA节点的第一阶子节点中查找。但是foreach这一句表示遍历NUAA下所有的节点,不只是第一阶子节点,因此它会打印出所有节点的INNERTEXT。这里加入xl.SelectSingleNode("CAE")和xl.Attributes["name"].Value只是测试用,不加的话他们对应节点的INNERTEXT值也会被打印出来的,现在就是相当于打印两遍就是了。主要是想弄清xl.SelectSingleNode("CAE")和xl.Attributes["name"].Value这只有CAE和name的父节点是NUAA时才不报错。
try
{
string path = "happy.xml";
string st = "";
XmlDocument xd1 = new XmlDocument();
xd1.Load(path);
XmlNodeList xnl = xd1.SelectNodes("/NUAA");
foreach (XmlNode xl in xnl)
{
st += xl.InnerText;
XmlNode XL = xl.SelectSingleNode("CAE");
st += XL.InnerText;
st += xl.Attributes["name"].Value;
}
tb.AppendText(st);
}
catch
{
MessageBox.Show("文件读取失败!");
}