C# 解析XML文件,使用XmlNode["..."]的方式能访问到此节点下的多个同名节点吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 解析XML文件,使用XmlNode["..."]的方式能访问到此节点下的多个同名节点吗?相关的知识,希望对你有一定的参考价值。

例如
<node>
<childNode>节点1</childNode>
<childNode>节点2</childNode>

</node>

通过节点名的方式能否访问到 节点2?

参考技术A 能,
C#操作XML时,要引入命名空间using System.Xml

获取根节点的方法:
1、知道根节点名称:
XmlNode root = xmlDoc.SelectSingleNode("根节点名称");
2、不知道根节点名称:
XmlElement root = xmlDoc.DocumentElement;
xml中node(节点)和element(元素)的区别(还是不太明白)
1、element是一个小范围的定义,必须含有完整信息的结点才能叫做元素。例如:<div>内容</div>,一个元素一定是一个节点,一个节点不一定是一个元素。
2、node是基本对象,attribute,element,text等都是node的子对象。
创建节点
1、CreateElement() 方法
有一个参数,两个参数,三个参数三种重载,参数类型均为string。
一个参数:CreateElement("元素名称")
两个参数:CreateElement("元素名称","元素的命名空间")
三个参数:CreateElement("元素的前缀","元素的名称","元素的命名空间")
2、CreateNode() 方法
三个参数 都为string类型
CreateNode("节点类型","节点名称","节点命名空间")
四个参数 都为string类型
CreateNode("节点类型","节点的前缀","节点名称","节点命名空间")
问题:节点前缀有什么作用?结点命名空间有什么作用?
增加节点:
1、AppendChild() 方法
2、InsertAfter(要插入的节点,参考节点) 方法
3、InsertBefore(要插入的节点,参考节点) 方法
增加节点属性:
SetAttribute("属性名","属性值")方法

删除节点属性:
RemoveAttribute("属性名称")
给节点添加数据:
1、给节点的innerText赋值
例子:XmlElement eName = doc.CreateElement("name");
eName.InnerText = aaaaa;
2、添加XmlText节点,为其添加值
添加节点元素
将XmlText以子节点的方式添加给节点元素
例子: XmlElement eName = xmlDoc.CreateElement("name");
XmlText tName = xmlDoc.CreateTextNode(aaaaa);
eName.AppendChild(tName);
寻找某个节点(寻找name节点):
先找到根节点,找出根节点下的节点列表(XmlNodeList),遍历每个节点。
再找每个节点下的节点列表,进行遍历,指导找到所需要的节点。
<msg>
<name></name>
<content></content>
</msg>
方法:
XmlNode root = xmlDoc.SelectSingleNode("msg");
XmlNodeList nodeList = root.ChildNodes;
foreach (XmlNode node in nodeList)

if(node.Name=="name")

找到name节点,进行操作


删除节点
RemoveAll(无参数)
RemoveChild(要移除的节点)
更新节点
1、ReplaceChild(新节点,老节点)
建立一个新节点,替换老节点
2、找到要更新的节点,重新设置其属性和数据
用GridView显示xml文件中的数据
view plaincopy to clipboardprint?
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("BooksInfo.xml"));
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
DataSet ds = new DataSet();
ds.ReadXml(Server.MapPath("BooksInfo.xml"));
GridView1.DataSource = ds.Tables[0];
GridView1.DataBind();
xml文件
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book genre="ee" ISBN="2-3631-4">
<title>三国演义</title>
<author>lfdfd</author>
<price>55.95</price>
</book>
<book ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>涨红</author>
<price>58.3</price>
</book>
<book genre="计算机" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>盖茨</author>
<price>58.3</price>
</book>
<book genre="计算机" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>盖茨</author>
<price>58.3</price>
</book>
</bookstore>
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book genre="ee" ISBN="2-3631-4">
<title>三国演义</title>
<author>lfdfd</author>
<price>55.95</price>
</book>
<book ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>涨红</author>
<price>58.3</price>
</book>
<book genre="计算机" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>盖茨</author>
<price>58.3</price>
</book>
<book genre="计算机" ISBN="2-3631-4">
<title>CS从入门到精通</title>
<author>盖茨</author>
<price>58.3</price>
</book>
</bookstore>
显示效果:

删除属性为计算机的节点
view plaincopy to clipboardprint?
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("xml/BooksInfo.xml"));
XmlNodeList xnl = xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach (XmlNode xn in xnl)

XmlElement xe = (XmlElement)xn;

if (xe.GetAttribute("genre") == "计算机")

xe.RemoveAll();//删除属性=计算机的该节点的全部内容
//xe.ParentNode.RemoveChild(xe);



xmlDoc.Save(Server.MapPath("xml/BooksInfo.xml"));
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(Server.MapPath("xml/BooksInfo.xml"));
XmlNodeList xnl = xmlDoc.SelectSingleNode("bookstore").ChildNodes;
foreach (XmlNode xn in xnl)

XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("genre") == "计算机")

xe.RemoveAll();//删除属性=计算机的该节点的全部内容
//xe.ParentNode.RemoveChild(xe);



xmlDoc.Save(Server.MapPath("xml/BooksInfo.xml"));
xe.ParentNode.RemoveChild(xe)
寻找到xe节点的父节点,再删除他的子节点。那么此节点(包括节点标记)将不存在。显示中将没有空行
xe.RemoveAll()
移除节点内容,但是节点标签还在。显示中有空行

C#读取xml

        //初始化一个xml对象
        XmlDocument xml = new XmlDocument();
        //加载xml文件
        xml.Load("文件路径");
//xml.LoadXml("xml内容"); //读取指定的节点 XmlNode xmlNode = xml.SelectSingleNode("/节点名"); //判断节点下是否有子节点 xmlNode.HasChildNodes; //读取节点下的所有子节点 XmlNodeList xmlNodeList = xmlNode.ChildNodes; //读取同名同级多个节点列表 XmlNodeList xmlNodeList = xml.SelectNodes("/root/节点名"); //读取节点的属性string attribute = xmlNode.Attributes["属性名"].Value; //读取节点的文本string value = xmlNode.InnerText; //创建一个新的节点 XmlNode xmlNode = xml.CreateElement("节点名"); //保存xml文件 xml.Save("文件路径");

以上是关于C# 解析XML文件,使用XmlNode["..."]的方式能访问到此节点下的多个同名节点吗?的主要内容,如果未能解决你的问题,请参考以下文章

c# .net 怎么将一个xml字符串 转换成一个xmlnode ,(不是xmldocument)

XML文件的操作说明

C# 中 XmlNode.SelectSingleNode(string xpath) 的正确用法是啥?

C#操作XML

C#读取xml

C#如何在xmlnode中存储网站列表