1、XML基础知识
- 文件声明:<?xml version="1.0"?> ,最简单的声明方式
- 文档中必须有一个根标签
- 属性用双引号或单引号引起来
- CDATA区、特殊字符 <![CATAT[不想解析的内容]]>
- 特殊符号
- & : &;
- < : <
- > : >
- " : "
- , : apos;
<?xml version="1.0" encoding="utf-8"?>
<students> <!--定义一个根节点-->
<student name="xiaoming" />
<student>
<name>xiaoming</name>
<read><三国演义></read>
</student>
<student>
<name>xiaoqing</name>
<read>"三国演义"</read>
</student>
<!--以下区域块中内容不被解析器解析-->
<![CDATA[
<student>
<name>xiaobai</name>
<read>三国演义</read>
</student>
]]>
</students>
保存设置编码方式
2、生成xml文档
主函数
namespace xml_文件操作
{
class Program
{
static void Main(string[] args)
{
RWXml app = new RWXml();
app.WriteXML();
}
}
}
XML操作类
using System;
//引用命名空间
using System.Xml;
namespace xml_文件操作
{
public class RWXml
{
/// <summary>
/// 生成一个XML文档
/// </summary>
public void WriteXML()
{
//随机数
Random rd = new Random();
//首先,创建xml文档
/*1、实例化一个xmlDocument类*/
XmlDocument xdoc = new XmlDocument();
//创建一个声明xml文档所需要语法的变量
XmlDeclaration declaration = xdoc.CreateXmlDeclaration("1.0", "UTF-8", "yes"); //第一个参数是1.0指版本,第二个参数是编码方式,
// 上面语句第三个参数:standalone类型:System.String 包含"yes"或"no"的字符串,用来指定 XML 是独立的还是需要解析外部实体。
xdoc.AppendChild(declaration); //将指定的节点添加到该节点的子节点列表的末尾。
//一个xml文档,必须有一个根元素
//创建根节点students
XmlElement elem = xdoc.CreateElement("students");
//把根节点添加到xml文档中
xdoc.AppendChild(elem);
for(int i=1; i<=10; i++)
{
//添加子节点
XmlElement elem1 = xdoc.CreateElement("student");
//将第二级节点,放置到根节点的下面
elem.AppendChild(elem1);
//给节点添加属性,xml中属性值必须用双引号引起
elem1.SetAttribute("name", "张三");
elem1.SetAttribute("No",i.ToString());
//添加第三级节点
XmlElement elemet1_1 = xdoc.CreateElement("语文成绩");
//将第三级的节点,放置到第二级节点下面
elem1.AppendChild(elemet1_1);
elemet1_1.InnerText = rd.Next(60,100).ToString(); //获取或设置节点及其所有子级的串联值
//添加第三级节点
XmlElement elemet1_2 = xdoc.CreateElement("数学成绩");
//将第三级的节点,放置到第二级节点下面
elem1.AppendChild(elemet1_2);
elemet1_2.InnerText = rd.Next(60,100).ToString();
//添加第三级节点
XmlElement elemet1_3 = xdoc.CreateElement("外语成绩");
//将第三级的节点,放置到第二级节点下面
elem1.AppendChild(elemet1_3);
elemet1_3.InnerText = rd.Next(60,100).ToString();
}
xdoc.Save("students.xml");
}
}
}
3、读取xml文档及修改
using System;
//引用命名空间
using System.Xml;
namespace xml_文件操作
{
public class RWXml
{
/// <summary>
/// 读取xml文档
/// </summary>
public void ReadXML()
{
/*1、实例化一个xmlDocument类*/
XmlDocument xdoc = new XmlDocument();
//加载xml内容
xdoc.Load("students.xml");
//获取根节点Studets
XmlNode rootnode = xdoc.SelectSingleNode("students"); //获取第一个符合表达式(参数值)的XML节点,因为xml文件只有一个根节点,所以此处获取的是根节点
XmlNodeList nodeList = rootnode.ChildNodes;
foreach(XmlNode xn in nodeList)
{
string Nodename = xn.Name; //获取节点的名称
//Console.WriteLine(Nodename);
//类型显示转换
XmlElement xmle = (XmlElement)xn;
//获取属性
string nameAttri = xmle.GetAttribute("name");
string noAttri = xmle.GetAttribute("No");
if (noAttri == "5")
{
xmle.SetAttribute("name", "李四");
}
//先输出姓名和学号
Console.WriteLine("名称节点为" + Nodename +"的属性:"+ nameAttri+"/"+noAttri);
//获取三级节点
XmlNodeList childList = xn.ChildNodes;
foreach(XmlNode xn3 in xn)
{
//类型转换
XmlElement xe = (XmlElement)xn3;
string className = xe.Name;
string score = xe.InnerText;
//输出成绩信息
Console.Write(className+score+"\t");
if(noAttri=="10")
{
xe.InnerText = "100";
}
}
Console.WriteLine();
}
//生成或修改XML文档的时候,末尾一定要写save方法
xdoc.Save("students.xml");
Console.ReadKey();
}
}
}
4、其他参考信息
4.1 生成XML
private static void GenerateXMLFile(string xmlFilePath)
{
try
{
//初始化一个xml实例
XmlDocument myXmlDoc = new XmlDocument();
//创建xml的根节点
XmlElement rootElement = myXmlDoc.CreateElement("Computers");
//将根节点加入到xml文件中(AppendChild)
myXmlDoc.AppendChild(rootElement);
//初始化第一层的第一个子节点
XmlElement firstLevelElement1 = myXmlDoc.CreateElement("Computer");
//填充第一层的第一个子节点的属性值(SetAttribute)
firstLevelElement1.SetAttribute("ID", "11111111");
firstLevelElement1.SetAttribute("Description", "Made in China");
//将第一层的第一个子节点加入到根节点下
rootElement.AppendChild(firstLevelElement1);
//初始化第二层的第一个子节点
XmlElement secondLevelElement11 = myXmlDoc.CreateElement("name");
//填充第二层的第一个子节点的值(InnerText)
secondLevelElement11.InnerText = "Lenovo";
firstLevelElement1.AppendChild(secondLevelElement11);
XmlElement secondLevelElement12 = myXmlDoc.CreateElement("price");
secondLevelElement12.InnerText = "5000";
firstLevelElement1.AppendChild(secondLevelElement12);
XmlElement firstLevelElement2 = myXmlDoc.CreateElement("Computer");
firstLevelElement2.SetAttribute("ID", "2222222");
firstLevelElement2.SetAttribute("Description", "Made in USA");
rootElement.AppendChild(firstLevelElement2);
XmlElement secondLevelElement21 = myXmlDoc.CreateElement("name");
secondLevelElement21.InnerText = "IBM";
firstLevelElement2.AppendChild(secondLevelElement21);
XmlElement secondLevelElement22 = myXmlDoc.CreateElement("price");
secondLevelElement22.InnerText = "10000";
firstLevelElement2.AppendChild(secondLevelElement22);
//将xml文件保存到指定的路径下
myXmlDoc.Save(xmlFilePath);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
4.2 读取xml(属性获取可以参看,与3中中属性获取不同)
- 内含判断是否还有子节点
- 属性获取可以参看,与3中中属性获取不同
- 可使用索引值的方式获取响应的子节点
private static void GetXMLInformation(string xmlFilePath)
{
try
{
//初始化一个xml实例
XmlDocument myXmlDoc = new XmlDocument();
//加载xml文件(参数为xml文件的路径)
myXmlDoc.Load(xmlFilePath);
//获得第一个姓名匹配的节点(SelectSingleNode):此xml文件的根节点
XmlNode rootNode = myXmlDoc.SelectSingleNode("Computers");
//分别获得该节点的InnerXml和OuterXml信息
string innerXmlInfo = rootNode.InnerXml.ToString();
string outerXmlInfo = rootNode.OuterXml.ToString();
//获得该节点的子节点(即:该节点的第一层子节点)
XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
foreach (XmlNode node in firstLevelNodeList)
{
//获得该节点的属性集合
XmlAttributeCollection attributeCol = node.Attributes;
foreach (XmlAttribute attri in attributeCol)
{
//获取属性名称与属性值
string name = attri.Name;
string value = attri.Value;
Console.WriteLine("{0} = {1}", name, value);
}
//判断此节点是否还有子节点
if (node.HasChildNodes)
{
//获取该节点的第一个子节点
XmlNode secondLevelNode1 = node.FirstChild;
//获取该节点的名字
string name = secondLevelNode1.Name;
//获取该节点的值(即:InnerText)
string innerText = secondLevelNode1.InnerText;
Console.WriteLine("{0} = {1}", name, innerText);
//获取该节点的第二个子节点(用数组下标获取)
XmlNode secondLevelNode2 = node.ChildNodes[1];
name = secondLevelNode2.Name;
innerText = secondLevelNode2.InnerText;
Console.WriteLine("{0} = {1}", name, innerText);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
4.3 修改子节点
private static void ModifyXmlInformation(string xmlFilePath)
{
try
{
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(xmlFilePath);
XmlNode rootNode = myXmlDoc.FirstChild;
XmlNodeList firstLevelNodeList = rootNode.ChildNodes;
foreach (XmlNode node in firstLevelNodeList)
{
//修改此节点的属性值
if (node.Attributes["Description"].Value.Equals("Made in USA"))
{
node.Attributes["Description"].Value = "Made in HongKong";
}
}
//要想使对xml文件所做的修改生效,必须执行以下Save方法
myXmlDoc.Save(xmlFilePath);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
4.4 删除子节点
private static void DeleteXmlInformation(string xmlFilePath)
{
try
{
XmlDocument myXmlDoc = new XmlDocument();
myXmlDoc.Load(xmlFilePath);
foreach (XmlNode node in myXmlDoc.FirstChild.ChildNodes)
{
//记录该节点下的最后一个子节点(简称:最后子节点)
XmlNode lastNode = node.LastChild;
//删除最后子节点下的左右子节点
lastNode.RemoveAll();
//删除最后子节点
node.RemoveChild(lastNode);
}
//保存对xml文件所做的修改
myXmlDoc.Save(xmlFilePath);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}
4.5 XML操作总结
//所需要添加的命名空间
using System.Xml;
//初始化一个xml实例
XmlDocument xml=new XmlDocument();
//导入指定xml文件
xml.Load(“xml文件路径path”);
//指定一个节点
XmlNode root=xml.SelectSingleNode("节点名称");
//获取节点下所有直接子节点
XmlNodeList childlist=root.ChildNodes;
//判断该节点下是否有子节点
root.HasChildNodes;
//获取同名同级节点集合
XmlNodeList nodelist=xml.SelectNodes("节点名称");
//生成一个新节点
XmlElement node=xml.CreateElement("节点名称");
//将节点加到指定节点下,作为其子节点
root.AppendChild(node);
//将节点加到指定节点下某个子节点前
root.InsertBefore(node,root.ChildeNodes[i]);
//为指定节点的新建属性并赋值
node.SetAttribute("id","11111");
//为指定节点添加子节点
root.AppendChild(node);
//获取指定节点的指定属性值
string id=node.Attributes["id"].Value;
//获取指定节点中的文本
string content=node.InnerText;
//保存XML文件
xml.Save(“xml文件存储的路径path”);