【问题标题】:Get a node from a node from Xml从 Xml 中的节点获取节点
【发布时间】:2015-07-18 00:57:32
【问题描述】:

我有一个简单的 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 以及相关的子任务(子任务 1、子任务 2)及其数据。

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

【问题讨论】:

  • 你有没有尝试过?
  • 同意@EkoostikMartin,请对 XPATH 查询做一些研究,看看如何在你的 C# 代码中使用 XPATH,然后如果你遇到问题,发布问题并附上你尝试过的细节。不要指望别人为你做功课。
  • 我刚刚弄明白了。 :) 该节点是一个任务节点。 XmlNodeList subtasks = node.SelectNodes("subtask");

标签: c# xml


【解决方案1】:

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

将 .Net 中的 XmlDocument 类与您的 XPath 表达式一起使用。

【讨论】:

  • 这里是 xpath //subtask
【解决方案2】:

试试下面的代码:

  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);
        }

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多