从Xml的节点中获取节点

本文关键字:节点 获取 Xml | 更新日期: 2023-09-27 18:03:26

我有一个简单的xml文件。如下所示:

<?xml version="1.0" encoding="utf-8" ?> 
<activities>
  <task>
    <name> Task1 </name>
    <time> 00:00 </time>
    <subtask>
      <name> Task1 - subtask1 </name>
      <time> 00:00 </time>
    </subtask>
    <subtask>
      <name> Task1 - subtask2 </name>
      <time> 00:00 </time>
    </subtask>
  </task>
  <task>
    <name> Task2 </name>
    <time> 00:00 </time>
    <subtask>
      <name> Task2 - subtask1 </name>
      <time> 00:00 </time>
    </subtask>
  </task>
</activities>

我的问题是如何从每个任务中获得每个子任务节点?例如,首先我想获得任务1和相关的子任务(subtask1, subtask2)及其数据。

我如何在c#中以适当的方式做到这一点?我是XML的新手。:)

从Xml的节点中获取节点

使用XPath语法选择需要的内容。

使用。net中的XmlDocument类和XPath表达式。

试试下面的代码:

  String myXML = @" <?xml version='1.0' encoding='utf-8' ?> 
            <activities>
              <task>
                <name> Task1 </name>
                <time> 00:00 </time>
                <subtask>
                  <name> Task1 - subtask1 </name>
                  <time> 00:00 </time>
                </subtask>
                <subtask>
                  <name> Task1 - subtask2 </name>
                  <time> 00:00 </time>
                </subtask>
              </task>
              <task>
                <name> Task2 </name>
                <time> 00:00 </time>
                <subtask>
                  <name> Task2 - subtask1 </name>
                  <time> 00:00 </time>
                </subtask>
              </task>
            </activities>";
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(myXML);
        XmlNodeList items = doc.DocumentElement.SelectNodes("//subtask");

SelectNodes参数是一个XPath查询,它选择作为task的直接子任务的所有子任务。您可以在这里找到更多关于XPath的信息:http://www.w3schools.com/xpath/default.asp

你可以阅读下面的信息:

        List<String> names=new List<string>();
        for(int i=0;i<items.Count;i++)
        {
            names.Add(items.Item(i).InnerText);
        }

尝试XML LInq

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = 
              "<?xml version='"1.0'" encoding='"utf-8'" ?>" + 
                "<activities>" +
                  "<task>" +
                    "<name>Task1</name>" +
                    "<time>00:00</time>" +
                    "<subtask>" +
                      "<name>Task1 - subtask1</name>" +
                      "<time>00:00</time>" +
                    "</subtask>" +
                    "<subtask>" +
                      "<name>Task1 - subtask2</name>" +
                      "<time>00:00</time>" +
                    "</subtask>" +
                  "</task>" +
                  "<task>" +
                    "<name>Task2</name>" +
                    "<time>00:00</time>" +
                    "<subtask>" +
                      "<name>Task2 - subtask1</name>" +
                      "<time>00:00</time>" +
                    "</subtask>" +
                  "</task>" +
                "</activities>" ;
            XDocument doc = XDocument.Parse(input);
            var results = doc.Descendants("task").Select(x => new {
                name = x.Element("name").Value,
                time = x.Element("time").Value,
                subtask = x.Elements("subtask").Select(y => new {
                    name = y.Element("name").Value,
                    time = y.Element("time").Value
                }).ToList()
            }).ToList();
        }
    }
}
​