2016-07-30 3 views
0
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 атрибута, и других остающимся внутренний атрибут узла?Невозможно получить список из XML с помощью XPathNavigator

ответ

0

Я предложил бы использовать LINQ к XML через XPath, но если вы должны использовать 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 для рабочей демонстрации.

+0

охлаждает свою работу, не могли бы вы объяснить мне, почему« string.Empty »было принято –

+0

Имя в XML составлено из две части: пространство имен и локальное имя. 'string.Empty' или' '' 'используется здесь, потому что имена в вашем XML не имеют пространства имен. –

0

Используйте вложенный цикл. Сначала получить рабочие узлы с configuration/company/work. получить атрибут worktype и хранить в переменной. Затем цикл через worktype дочерние узлы и добавить строку в список для каждого из

+0

Пробовал то же самое, но когда я делаю цикл foreach для конфигурации/компании/работы/рабочего времени, он добавляет двойную запись для одного и того же типа работы, означает выше 2 записи для homeWork - я получаю 4 записи для нее, которые включают в себя 2 собственных и других 2 записи officeWork –

+0

могут использовать общий код для того же –

0

Использовать чистую библиотеку 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(); 
     } 
    } 
} 
+0

благодаря его работе, но я должен сделать это с помощью xPathNavigator –

+0

Мне не нравится использование сторонних библиотек DLL, которые могут содержать вирусы. – jdweng

+1

@jdweng да, что 'System.Xml.dll' из Microsoft часто известно для доставки с вирусами;) –