目录(?)[-]

  1. XmlDocumentSelectSingleNode方法的使用
  2. XmlDocumentSelectNodes方法的使用
  3. 通过节点属性查找指定节点
 

参考:Select XML Nodes by Name

假设xml文件内容是

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Workflow>
  3. <Activity>
  4. <ActivityId>1</ActivityId>
  5. <ActivityName>start</ActivityName>
  6. <BindingPageId>1</BindingPageId>
  7. <BindingRoleId>1</BindingRoleId>
  8. <ActivityLevel>1</ActivityLevel>
  9. </Activity>
  10. <Activity>
  11. <ActivityId>2</ActivityId>
  12. <ActivityName>pass</ActivityName>
  13. <BindingPageId>2</BindingPageId>
  14. <BindingRoleId>2</BindingRoleId>
  15. <ActivityLevel>2</ActivityLevel>
  16. </Activity>
  17. </Workflow>

<?xml version="1.0" encoding="utf-8"?>
<Workflow>
<Activity>
<ActivityId>1</ActivityId>
<ActivityName>start</ActivityName>
<BindingPageId>1</BindingPageId>
<BindingRoleId>1</BindingRoleId>
<ActivityLevel>1</ActivityLevel>
</Activity>
<Activity>
<ActivityId>2</ActivityId>
<ActivityName>pass</ActivityName>
<BindingPageId>2</BindingPageId>
<BindingRoleId>2</BindingRoleId>
<ActivityLevel>2</ActivityLevel>
</Activity>
</Workflow>

我们需要读取Activity节点下的内容,因为存在多个Activity,所以需要读取多个节点。可以使用 XmlDocument.SelectSingleNode和XmlDocument.SelectNodes方法查找节点。前一个是查找匹配的第一个节点,而后一个则会返回一个节点列表。

1.XmlDocument.SelectSingleNode方法的使用

首先创建一个读取xml文件的方法ReadXmlNode

  1. /// <summary>
  2. /// 读取xml中的指定节点的值
  3. /// </summary>
  4. public void ReadXmlNode(string filename)
  5. {
  6. XmlDocument xmlDoc = new XmlDocument();
  7. try
  8. {
  9. xmlDoc.Load(filename);
  10. //读取Activity节点下的数据。SelectSingleNode匹配第一个Activity节点
  11. XmlNode root = xmlDoc.SelectSingleNode("//Activity");//当节点Workflow带有属性是,使用SelectSingleNode无法读取
  12. if (root != null)
  13. {
  14. string ActivityId = (root.SelectSingleNode("ActivityId")).InnerText;
  15. string ActivityName = (root.SelectSingleNode("ActivityName ")).InnerText;
  16. string ActivityLevel = root.SelectSingleNode("ActivityLevel").InnerText;
  17. Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);
  18. }
  19. else
  20. {
  21. Console.WriteLine("the node  is not existed");
  22. //Console.Read();
  23. }
  24. }
  25. catch (Exception e)
  26. {
  27. //显示错误信息
  28. Console.WriteLine(e.Message);
  29. }
  30. }

/// <summary>
/// 读取xml中的指定节点的值
/// </summary>
public void ReadXmlNode(string filename)
{
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.Load(filename);
//读取Activity节点下的数据。SelectSingleNode匹配第一个Activity节点
XmlNode root = xmlDoc.SelectSingleNode("//Activity");//当节点Workflow带有属性是,使用SelectSingleNode无法读取
if (root != null)
{
string ActivityId = (root.SelectSingleNode("ActivityId")).InnerText;
string ActivityName = (root.SelectSingleNode("ActivityName ")).InnerText;
string ActivityLevel = root.SelectSingleNode("ActivityLevel").InnerText;
Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);
}
else
{
Console.WriteLine("the node is not existed");
//Console.Read();
}
}
catch (Exception e)
{
//显示错误信息
Console.WriteLine(e.Message);
}
}

然后在主函数中调用该方法

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. XMLOperation xmlOpr = new XMLOperation();
  6. xmlOpr.ReadXmlNode("activity.xml");
  7. Console.Read();
  8. }
  9. }

class Program
{
static void Main(string[] args)
{
XMLOperation xmlOpr = new XMLOperation();
xmlOpr.ReadXmlNode("activity.xml");
Console.Read();
}
}

输出结果为:

ActivityId:1 ActivityName:start ActivityLevel:1

2.XmlDocument.SelectNodes方法的使用

  1. /// <summary>
  2. /// 读取xml中的指定节点的值,如果有多个同名节点,则全部读取
  3. /// </summary>
  4. public void ReadXmlNodes(string filename)
  5. {
  6. XmlDocument xmlDoc = new XmlDocument();
  7. try
  8. {
  9. xmlDoc.Load(filename);
  10. XmlNodeList xnList = xmlDoc.SelectNodes("//Activity");
  11. Console.WriteLine("共有{0}个节点", xnList.Count);//输出xnList中节点个数。
  12. foreach (XmlNode xn in xnList)
  13. {
  14. //无法使用xn["ActivityId"].InnerText
  15. string ActivityId = (xn.SelectSingleNode("ActivityId")).InnerText;
  16. string ActivityName = xn.SelectSingleNode("ActivityName").InnerText;
  17. string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;
  18. //  Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);
  19. Console.WriteLine("ActivityId:  {0}/nActivityName:  {1}/nActivityLevel:  {2}", ActivityId, ActivityName, ActivityLevel);
  20. }
  21. }
  22. catch (Exception e)
  23. {
  24. //显示错误信息
  25. Console.WriteLine(e.Message);
  26. }
  27. }

/// <summary>
/// 读取xml中的指定节点的值,如果有多个同名节点,则全部读取
/// </summary>
public void ReadXmlNodes(string filename)
{
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.Load(filename);
XmlNodeList xnList = xmlDoc.SelectNodes("//Activity");
Console.WriteLine("共有{0}个节点", xnList.Count);//输出xnList中节点个数。
foreach (XmlNode xn in xnList)
{
//无法使用xn["ActivityId"].InnerText
string ActivityId = (xn.SelectSingleNode("ActivityId")).InnerText;
string ActivityName = xn.SelectSingleNode("ActivityName").InnerText;
string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;
// Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);
Console.WriteLine("ActivityId: {0}/nActivityName: {1}/nActivityLevel: {2}", ActivityId, ActivityName, ActivityLevel);
}
}
catch (Exception e)
{
//显示错误信息
Console.WriteLine(e.Message);
}
}

然后在主函数中调用该方法

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. XMLOperation xmlOpr = new XMLOperation();
  6. xmlOpr.ReadXmlNodes("activity.xml");
  7. Console.Read();
  8. }
  9. }

class Program
{
static void Main(string[] args)
{
XMLOperation xmlOpr = new XMLOperation();
xmlOpr.ReadXmlNodes("activity.xml");
Console.Read();
}
}

输出结果为:

共有2个节点 ActivityId:  1 ActivityName:  start ActivityLevel:  1 ActivityId:  2 ActivityName:  pass ActivityLevel:  2

3.通过节点属性查找指定节点

参考http://www.csharp-examples.net/xml-nodes-by-attribute-value/,虽然没有用到参考文章中的方法,不过总觉得以后会用到的。

  1. /// <summary>
  2. ///通过ActivityLevel获取xmlnode,需要保证ActivityLevel在一个xml文档中是唯一的。
  3. /// </summary>
  4. public XmlNode getXmlNode(string filename, string activitylevel)
  5. {
  6. XmlDocument xmlDoc = new XmlDocument();
  7. try
  8. {
  9. xmlDoc.Load(filename);
  10. XmlNodeList xnList = xmlDoc.SelectNodes("//Activity");//当节点Workflow带有属性是,使用SelectSingleNode无法读取
  11. foreach (XmlNode xn in xnList)
  12. {
  13. string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;
  14. if(activitylevel==ActivityLevel)
  15. {
  16. return xn;
  17. }
  18. }
  19. }
  20. catch (Exception e)
  21. {
  22. //显示错误信息
  23. Console.WriteLine(e.Message);
  24. }
  25. return null;
  26. }

/// <summary>
///通过ActivityLevel获取xmlnode,需要保证ActivityLevel在一个xml文档中是唯一的。
/// </summary>
public XmlNode getXmlNode(string filename, string activitylevel)
{
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.Load(filename);
XmlNodeList xnList = xmlDoc.SelectNodes("//Activity");//当节点Workflow带有属性是,使用SelectSingleNode无法读取
foreach (XmlNode xn in xnList)
{
string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;
if(activitylevel==ActivityLevel)
{
return xn;
}
}
}
catch (Exception e)
{
//显示错误信息
Console.WriteLine(e.Message);
}
return null;
}

然后在主函数中调用该方法

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. XMLOperation xmlOpr = new XMLOperation();
  6. XmlNode xn=xmlOpr.getXmlNode("activity.xml", "2");
  7. string ActivityId = (xn.SelectSingleNode("ActivityId")).InnerText;
  8. string ActivityName = (xn.SelectSingleNode("ActivityName ")).InnerText;
  9. string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;
  10. Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);
  11. Console.Read();
  12. }
  13. }

class Program
{
static void Main(string[] args)
{
XMLOperation xmlOpr = new XMLOperation();
XmlNode xn=xmlOpr.getXmlNode("activity.xml", "2");
string ActivityId = (xn.SelectSingleNode("ActivityId")).InnerText;
string ActivityName = (xn.SelectSingleNode("ActivityName ")).InnerText;
string ActivityLevel = xn.SelectSingleNode("ActivityLevel").InnerText;
Console.WriteLine("ActivityId:" + ActivityId + "/nActivityName:" + ActivityName + "/nActivityLevel:" + ActivityLevel);
Console.Read();
}
}

输出结果为:

ActivityId:2 ActivityName:pass ActivityLevel:2

C#中读取xml文件指定节点的更多相关文章

  1. C#读取xml文件指定节点下的值

    #region 读取xml文件指定节点下的值 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(result); XmlNode root ...

  2. 读取XML文件的节点内的内容

    <?xml version="1.0" encoding="utf-8" ?> <data> <tag3>15</ta ...

  3. .net中读取xml文件中节点的所有属性信息

    功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中 ...

  4. PHP读取XML文件数据获取节点值

    最近在接入渠道的时候遇到接口返回是xml数据.现在接口数据返回json数据格式比较常见. 如何获取xml里面真正数据? 对象结果集合单个值的强制转换处理.(直接代码说明) demo示例:  创建xml ...

  5. Silverlight 中 读取XML文件

    一:xml文件 二:后台代码 private void ReadXml() { List<TreeViewItem> nodes = new List<TreeViewItem> ...

  6. 使用javascript中读取Xml文件做成的一个二级联动菜单

    [html] view plaincopy <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> ...

  7. java Domj4读取xml文件

    先概括,再以代码形式给出. 获取节点: Iterator  Element.nodeIterator();  //获取当前标签节点下的所有子节点 获取 标签: Element Document.get ...

  8. js 读取xml文件

    读取xml文件 [原创 2007-6-20 17:35:37]     字号:大 中 小 js中读取xml文件,简单的例子: <html><head><script> ...

  9. opencv局限:cv::FileStorage读取中,xml文件的第一层节点不能超过4个

    今天测试发现一个问题,cv::FileStorage读取中,xml文件的第一层节点不能超过4个. <?xml version="1.0"?> <opencv_st ...

随机推荐

  1. An error occurred (500 Error)

    Centos7 部署知乎出现上图问题 解决方法: [root@web02 ~]# vim /etc/php.ini #修改配置文件 session.auto_start = 0 #这条设置成0 [ro ...

  2. python --- 08 文件操作

    一.   文件 f = open(文件路径,mode = '模式',encoding = '编码格式') 1.基础 ① 读写时,主要看光标的位置 ②操作完成要写    f.close( ) f.flu ...

  3. How to use Junit Listener

    JUnit Listeners If you want to do some operations when your tests are started, passed, finished, fai ...

  4. c++ vector常见用法

    //输出尾巴的元素 cout<<vec.back(); //定义vector迭代器 vector<int>::iterator ite=vec.begin(); for(ite ...

  5. 【做题】CF239E. k-d-sequence——线段树

    首先,容易得到判断一个子串为"good k-d sequence"的方法: 子串中没有重复元素,且所有元素模d相等. 记mx为除以d的最大值,mn为除以d的最小值,则\(mx-mn ...

  6. [CodeForces - 276A] Lunch Rush

    题目链接:http://codeforces.com/problemset/problem/276/A 从这n个输入中求最大值,注意 和 k的比较,定义一个maxn,对每个输入进行计算即可. AC代码 ...

  7. LeetCode - 198 简单动态规划 打家劫舍

    你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个代表每 ...

  8. Execl矩阵如何转化成Pajek的net文件

    在科研中我们有时会把把execl矩阵利用Ucinet.Pajek等可视化软件进行画图,而想要把execl矩阵转化为 Pajek可识别的文件-->net文件令很多初学者头疼不已,本文将做详细介绍. ...

  9. 【Cucumber】【命令行】

    知识点 参考:https://www.cnblogs.com/worklog/p/5253297.html cucumber的命令行选项 首先查看命令行选项.和其它命令行工具一样,cucumber提供 ...

  10. React Native原生模块向JS传递数据的几种方式(Android)

    一般情况可以分为三种方式: 1. 通过回调函数Callbacks的方式 2. 通过Promises的异步的方式 3. 通过发送事件的事件监听的方式. 参考文档:传送门