<根元素>
是根元素<根元素>
根元素>
和
是段落元素的开始和结束标签<p>这是一个段落。p>
href
是链接元素的属性,值为一个URL:<a href="http://www.example.com">这是一个链接a>
结束。例如,以下的XML文档中,
是一个注释:
是一个处理指令,它指定了一个与XML文档关联的样式表:
命名空间:一个用于定义XML文档中元素和属性的范围和作用域的机制。它允许在XML文档中定义多个不同的命名空间,以便将元素和属性限制在特定的范围内。
在XML中,命名空间被定义为一个URI(统一资源标识符),它为XML元素提供一个唯一的名称。命名空间可以用于区分具有相同名称的元素或属性,使用命名空间可以帮助避免名称冲突。
在XML文档中,命名空间可以用以下两种方式定义:
<root>
<element xmlns="http://example.com/">element>
root>
<root xmlns:ns="http://www.example.com">
<ns:element>Valuens:element>
root>
多个命名空间示例如下
<root xmlns:ns1="http://www.example.com/namespace1"
xmlns:ns2="http://www.example.com/namespace2">
<ns1:element1>Value 1ns1:element1>
<ns2:element2>Value 2ns2:element2>
root>
XmlDocument
对象,该对象包含了整个 XML 文档的内容。XmlDocument
对象可以通过 XmlReader
或 XmlWriter
类来读取或写入 XML 文件。XmlElement
对象,这些对象包含了元素的名称、属性和子元素。开发人员可以通过 XmlElement
对象的属性来访问元素的名称、属性和子元素。XmlAttribute
对象,这些对象包含了属性的名称和值。开发人员可以通过 XmlAttribute
对象的属性来访问属性的名称和值。XmlText
对象,这些对象包含了文本内容。开发人员可以通过 XmlText
对象的属性来访问文本内容。XmlNodeList
、XmlNodeReader
、XmlNodeWriter
等,用于处理 XML 文档中的节点列表、读取和写入 XML 节点等。System.Xml
下面。//创建xml文档
XmlDocument xmldoc = new XmlDocument();
//加入XML声明
XmlDeclaration xmldecl = xmldoc.CreateXmlDeclaration("1.0", "UTF-8", null);
xmldoc.AppendChild(xmldecl);
// 创建一个注释节点
XmlNode comment = xmldoc.CreateComment("这是一个注释");
xmldoc.AppendChild(comment);
//加入一个根元素
XmlElement employees = xmldoc.CreateElement("Employees");
xmldoc.AppendChild(employees);
//根元素加入一些子元素
for (int i = 1; i < 5; i++)
{
// 创建一个注释节点
XmlNode comment1 = xmldoc.CreateComment("Employee" + i);
employees.AppendChild(comment1);
XmlElement employee = xmldoc.CreateElement("Employee"+i);//创建一个子节点
employee.SetAttribute("name", "人员" + i);//设置该节点属性
XmlElement age = xmldoc.CreateElement("Age");//创建一个孙节点
age.InnerText = (18+i).ToString();//设置文本
employee.AppendChild(age);//添加到子节点中
XmlElement sex = xmldoc.CreateElement("Sex");//创建一个孙节点
sex.InnerText = i % 2 == 0 ? "男" : "女";//设置文本
employee.AppendChild(sex);//添加到子节点中
XmlElement salary = xmldoc.CreateElement("Salary");
salary.InnerText = (10000 + i * 100).ToString();
employee.AppendChild(salary);
employees.AppendChild(employee);//将子节点添加到根节点中
}
//保存创建好的XML文档
xmldoc.Save("test.xml");
<Employees>
<Employee1 name="人员1">
<Age>19Age>
<Sex>女Sex>
<Salary>10100Salary>
Employee1>
<Employee2 name="人员2">
<Age>20Age>
<Sex>男Sex>
<Salary>10200Salary>
Employee2>
<Employee3 name="人员3">
<Age>21Age>
<Sex>女Sex>
<Salary>10300Salary>
Employee3>
<Employee4 name="人员4">
<Age>22Age>
<Sex>男Sex>
<Salary>10400Salary>
Employee4>
Employees>
//创建xml文档
XmlDocument xmldoc = new XmlDocument();
//导入指定xml文件
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释,注释也是节点,但是无法转换成XmlElement,所以这里不忽略,下面转换就报错
//XmlReader是用liu需要using包起来,读完释放资源,防止占用
using (XmlReader reader = XmlReader.Create("test.xml", settings))
{
xmldoc.Load(reader);
}
//获取根节点
XmlElement employees=xmldoc.DocumentElement;
//遍历根节点的子节点
foreach (XmlElement employee in employees.ChildNodes)
{
StringBuilder sb = new StringBuilder();
sb.Append($"{employee.Name}--{employee.GetAttribute("name")}");
foreach (XmlElement child in employee.ChildNodes)
{
sb.Append($"--{child.Name}:{child.InnerText}");
}
Console.WriteLine(sb.ToString());
}
Employee1--人员1--Age:19--Sex:女--Salary:10100
Employee2--人员2--Age:20--Sex:男--Salary:10200
Employee3--人员3--Age:21--Sex:女--Salary:10300
Employee4--人员4--Age:22--Sex:男--Salary:10400
//创建xml文档
XmlDocument xmldoc = new XmlDocument();
//导入指定xml文件
xmldoc.Load("test.xml");
//获取根节点
XmlElement employees = xmldoc.DocumentElement;
//添加节点
XmlElement newemployee = xmldoc.CreateElement("Employee4");//创建一个子节点
newemployee.SetAttribute("name", "新的人员4");//设置该节点属性
XmlElement age = xmldoc.CreateElement("Age");//创建一个孙节点
age.InnerText = "88";//设置文本
newemployee.AppendChild(age);//添加到子节点中
XmlElement sex = xmldoc.CreateElement("Sex");//创建一个孙节点
sex.InnerText ="女博士";//设置文本
newemployee.AppendChild(sex);//添加到子节点中
XmlElement salary = xmldoc.CreateElement("Salary");
salary.InnerText = "20000";
newemployee.AppendChild(salary);
employees.InsertAfter(newemployee, employees.ChildNodes[1]);//将子节点添加到第1个节点后
//删除节点
XmlNode nodeDelete=employees.SelectSingleNode("//Employee1");//筛选匹配的第一个节点
employees.RemoveChild(nodeDelete);//删除筛选出来的节点
//修改节点
XmlElement nodeUpdate = employees.SelectSingleNode("//Employee2") as XmlElement;//筛选匹配的第一个节点
nodeUpdate.SetAttribute("name", "新的人员2");
nodeUpdate["Age"].InnerText = "99";
nodeUpdate["Sex"].InnerText = "男博士";
nodeUpdate["Salary"].InnerText = "18888";
//筛选多个节点
XmlNodeList nodes= employees.SelectNodes("//Employee4");
Console.WriteLine("打印筛选出的节点信息");
foreach (XmlElement employee in nodes)
{
StringBuilder sb = new StringBuilder();
sb.Append($"{employee.Name}--{employee.GetAttribute("name")}");
foreach (XmlElement child in employee.ChildNodes)
{
sb.Append($"--{child.Name}:{child.InnerText}");
}
Console.WriteLine(sb.ToString());
}
//保存创建好的XML文档
xmldoc.Save("test.xml");
Console.WriteLine();
Console.WriteLine("打印修改后的结果");
Console.WriteLine(File.ReadAllText("test.xml"));
打印筛选出的节点信息
Employee4--新的人员4--Age:88--Sex:女博士--Salary:20000
Employee4--人员4--Age:22--Sex:男--Salary:10400
打印修改后的结果
<?xml version="1.0" encoding="UTF-8"?>
<!--这是一个注释-->
<Employees>
<!--Employee1-->
<Employee4 name="新的人员4">
<Age>88</Age>
<Sex>女博士</Sex>
<Salary>20000</Salary>
</Employee4>
<!--Employee2-->
<Employee2 name="新的人员2">
<Age>99</Age>
<Sex>男博士</Sex>
<Salary>18888</Salary>
</Employee2>
<!--Employee3-->
<Employee3 name="人员3">
<Age>21</Age>
<Sex>女</Sex>
<Salary>10300</Salary>
</Employee3>
<!--Employee4-->
<Employee4 name="人员4">
<Age>22</Age>
<Sex>男</Sex>
<Salary>10400</Salary>
</Employee4>
</Employees>
//创建xml文档
XmlDocument xmldoc = new XmlDocument();
//加入一个根元素
XmlElement root = xmldoc.CreateElement("root");
//根元素添加命名空间属性
root.SetAttribute("xmlns:ns1", "http://www.example.com/namespace1");
root.SetAttribute("xmlns:ns2", "http://www.example.com/namespace2");
//添加子节点
XmlElement element1 = xmldoc.CreateElement("ns1:element1");
element1.InnerText = "Value 1";
root.AppendChild(element1);
//添加子节点
XmlElement element2 = xmldoc.CreateElement("ns2:element2");
element2.InnerText = "Value 2";
root.AppendChild(element2);
//添加子节点
XmlElement element3 = xmldoc.CreateElement("element3");
element3.SetAttribute("xmlns", "http://example.com/child");
element3.InnerText = "Value 3";
root.AppendChild(element3);
xmldoc.AppendChild(root);
//保存创建好的XML文档
xmldoc.Save("namespace.xml");
Console.WriteLine();
Console.WriteLine("多个命名空间");
Console.WriteLine();
Console.WriteLine(File.ReadAllText("namespace.xml"));
多个命名空间
<root xmlns:ns1="http://www.example.com/namespace1" xmlns:ns2="http://www.example.com/namespace2">
<element1>Value 1</element1>
<element2>Value 2</element2>
<element3 xmlns="http://example.com/child">Value 3</element3>
</root>
在C#中,可以使用XPath来筛选XML节点数据。XPath是一种用于在XML文档中查找信息的语言,它可以用来在XML文档中对元素和属性进行遍历。
XPath常见节点选择方法
//
:选择所有的节点,包括根节点。.
:选择当前节点。..
:选择当前节点的父节点。/
:选择根节点下的所有节点。//A
:选择所有名为"A"的节点。//A/B
:选择所有名为"A"的节点的"B"子节点。//A/*
:选择所有名为"A"的节点下的所有任意节点//A[1]
:选择文档中第一个名为"A"的节点。//A[@属性='属性值']
:选择所有名为"A"的节点,且属性=属性值的节点。//A[contains(@属性, “属性值”)]
:选择所有名为"A"的节点,且属性包含属性值的节点。//A[B='C']
:选择所有名为"A"的且子节点B等于’C’的节点。//A[B!='C']
:选择所有名为"A"的且子节点B不等于’C’的节点。//A[B!='C']
:选择所有名为"A"的且子节点B不等于’C’的节点。//A[B>'C']
:选择所有名为"A"的且子节点B大于’C’的节点。//A[B<'C']
:选择所有名为"A"的且子节点B小于’C’的节点。//A[B>='C']
:选择所有名为"A"的且子节点B大于等于’C’的节点。//A[B<='C']
:选择所有名为"A"的且子节点B小于等于’C’的节点。//A[B<='C' and B>='D']
:选择所有名为"A"的且子节点B小于等于’C’且B大于等于’D’的节点。//A[B<='C' or B>='D']
:选择所有名为"A"的且子节点B小于等于’C’或者B大于等于’D’的节点。//*[@属性='属性值']
:选择所有属性=属性值的节点。//A[@属性='属性值'][1]
:选择文档中第一个名为"A"的节点,且属性=属性值的节点。//A[@属性='属性值']/B
:选择所有名为"A"的节点,且属性=属性值的节点的"B"子节点。假设当前test2.xml文件如下:
<root xmlns:companya="http://www.example.com/companya" xmlns:companyb="http://www.example.com/companyb">
<companya:customer1 type='ACCCCC'>
<name>Johnname>
<age>10age>
companya:customer1>
<companya:customer1 type='BCCCCC'>
<name>Janename>
<age>15age>
companya:customer1>
<companya:customer2 type='CCCCCC'>
<name>Petername>
<age>20age>
companya:customer2>
<companya:customer3 type='DCCCCC'>
<name>Nancyname>
<age>25age>
companya:customer3>
<companyb:customer1 type="ACCCCC">
<name>Bobname>
<age>30age>
companyb:customer1>
<companyb:customer2 type="BCCCCC">
<name>Jobsname>
<age>33age>
companyb:customer2>
<companyb:customer3 type="CCCCCC">
<name>Andyname>
<age>38age>
companyb:customer3>
<companyb:customer3 type="DCCCCC">
<name>Leename>
<age>40age>
companyb:customer3>
root>
//创建xml文档
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load("test2.xml");
Console.WriteLine("选择节点");
XPathNodeIterator iterator1 = xmldoc.CreateNavigator().Select("//root/*");
while (iterator1.MoveNext())
{
XPathNavigator navigator = iterator1.Current;
Console.WriteLine(navigator.OuterXml);
}
Console.WriteLine("选择节点+条件");
XPathNodeIterator iterator2 = xmldoc.CreateNavigator().Select("//root/*[age>10 and age<30]");
while (iterator2.MoveNext())
{
XPathNavigator navigator = iterator2.Current;
Console.WriteLine(navigator.OuterXml);
}
Console.WriteLine("筛选包含命名空间前缀节点");
//筛选包含命名空间前缀节点,需要定义好命名空间,作为参数传入筛选器,否则筛选器无法识别命名空间
XmlNamespaceManager company = new XmlNamespaceManager(xmldoc.NameTable);
company.AddNamespace("companya", "http://www.example.com/companya");
company.AddNamespace("companyb", "http://www.example.com/companyb");
XPathNodeIterator iterator3 = xmldoc.CreateNavigator().Select("//companya:customer1", company);
while (iterator3.MoveNext())
{
XPathNavigator navigator = iterator3.Current;
Console.WriteLine(navigator.OuterXml);
}
Console.WriteLine("筛选包含命名空间前缀节点+条件");
XPathNodeIterator iterator4 = xmldoc.CreateNavigator().Select("//companya:customer1[contains(name,'o')]", company);
while (iterator4.MoveNext())
{
XPathNavigator navigator = iterator4.Current;
Console.WriteLine(navigator.OuterXml);
}
选择节点
<companya:customer1 type="ACCCCC" xmlns:companya="http://www.example.com/companya">
<name>John</name>
<age>10</age>
</companya:customer1>
<companya:customer1 type="BCCCCC" xmlns:companya="http://www.example.com/companya">
<name>Jane</name>
<age>15</age>
</companya:customer1>
<companya:customer2 type="CCCCCC" xmlns:companya="http://www.example.com/companya">
<name>Peter</name>
<age>20</age>
</companya:customer2>
<companya:customer3 type="DCCCCC" xmlns:companya="http://www.example.com/companya">
<name>Nancy</name>
<age>25</age>
</companya:customer3>
<companyb:customer1 type="ACCCCC" xmlns:companyb="http://www.example.com/companyb">
<name>Bob</name>
<age>30</age>
</companyb:customer1>
<companyb:customer2 type="BCCCCC" xmlns:companyb="http://www.example.com/companyb">
<name>Jobs</name>
<age>33</age>
</companyb:customer2>
<companyb:customer3 type="CCCCCC" xmlns:companyb="http://www.example.com/companyb">
<name>Andy</name>
<age>38</age>
</companyb:customer3>
<companyb:customer3 type="DCCCCC" xmlns:companyb="http://www.example.com/companyb">
<name>Lee</name>
<age>40</age>
</companyb:customer3>
选择节点+条件
<companya:customer1 type="BCCCCC" xmlns:companya="http://www.example.com/companya">
<name>Jane</name>
<age>15</age>
</companya:customer1>
<companya:customer2 type="CCCCCC" xmlns:companya="http://www.example.com/companya">
<name>Peter</name>
<age>20</age>
</companya:customer2>
<companya:customer3 type="DCCCCC" xmlns:companya="http://www.example.com/companya">
<name>Nancy</name>
<age>25</age>
</companya:customer3>
筛选包含命名空间前缀节点
<companya:customer1 type="ACCCCC" xmlns:companya="http://www.example.com/companya">
<name>John</name>
<age>10</age>
</companya:customer1>
<companya:customer1 type="BCCCCC" xmlns:companya="http://www.example.com/companya">
<name>Jane</name>
<age>15</age>
</companya:customer1>
筛选包含命名空间前缀节点+条件
<companya:customer1 type="ACCCCC" xmlns:companya="http://www.example.com/companya">
<name>John</name>
<age>10</age>
</companya:customer1>