从Xml的节点获取节点

时间:2015-07-17 15:16:46

标签: c# xml

我有一个简单的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的新手。 :)

3 个答案:

答案 0 :(得分:0)

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

使用.Net中的XmlDocument类以及XPath表达式。

答案 1 :(得分:0)

尝试以下代码:

  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查询,它选择所有子任务的子任务。 您可以在此处找到有关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);
        }

答案 2 :(得分:0)

尝试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();

        }
    }
}
​