无法使用xPathNavigator从xml获取列表

时间:2016-07-30 12:31:35

标签: c# xml list xpathnavigator

List<string> list = new List<string>();
foreach (XPathNavigator node in nav.Select("configuration/company/work/worktime"))
            {
                string day = getAttribute(node, "day");
                string time = getAttribute(node, "time");
                string worktype = ?? // how to get worktype attribute valuefrom parent node 
              list.Add(day,time,worktype); // add to list 
            }

 </configuration>
      <company>
        <work worktype="homeWork">
            <worktime day="30" time="10:28"></worktime>
            <worktime day="25" time="10:50"></worktime>
         </work>
        <work worktype="officeWork">
            <worktime day="12" time="09:28"></worktime>
            <worktime day="15" time="12:28"></worktime>
        </work>
      </company>
    </configuration>


need output as :
list[0] = homeWork,30,10:28
list[1] = homeWork,25,10:50
list[2] = officeWork,12,09:28
list[3] = officeWork,15,12:28

我正在尝试从XML获取列表,但未能获得如上所示的输出(使用xpath导航器,如何访问父节点以获取worktype属性,以及其他剩余的内部节点属性?

3 个答案:

答案 0 :(得分:0)

使用嵌套循环。最初使用configuration/company/work检索工作节点。检索worktype属性并存储在变量中。然后循环遍历子工作类型节点,并为每个节点添加一个字符串

答案 1 :(得分:0)

使用Net Library enhanced xml(linq xml)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            var results = doc.Descendants("work").Select(x => new {
                worktype = (string)x.Attribute("worktype"),
                worktime = x.Elements("worktime").Select(y => new {
                    day = (int)y.Attribute("day"),
                    time = (DateTime)y.Attribute("time")
                }).ToList()
            }).ToList();
        }
    }
}

答案 2 :(得分:0)

我建议在XPath上使用LINQ to XML,但如果必须使用XPathNavigator,则需要迭代每个work元素,然后迭代每个worktime子元素。这样您就可以使用父上下文中的worktype

foreach (XPathNavigator work in nav.Select("configuration/company/work"))
{
    var workType = work.GetAttribute("worktype", string.Empty);

    foreach (XPathNavigator worktime in work.Select("worktime"))
    {
        var day = worktime.GetAttribute("day", string.Empty);
        var time = worktime.GetAttribute("time", string.Empty);

        list.Add($"{workType}, {day}, {time}");
    }
}

有关正常工作的演示,请参阅this fiddle