2016-07-30 6 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 

Ich versuche, die Liste von XML zu erhalten, aber scheiterte Ausgabe zu erhalten, wie oben angegeben (XPath Navigator verwenden, wie kann ich übergeordneten Knoten zugreifen Diktatart Attribut zu bekommen, und anderer Rest inneren Knotenattribut?Unable Liste von XML erhalten mit XPathNavigator

Antwort

0

Ich würde mit LINQ to XML über XPath vorschlagen, aber wenn Sie verwenden müssen, müssen Sie XPathNavigator dann von jedem ihrer worktime geordneten Elemente gefolgt jedes work Element zu durchlaufen. Auf diese Weise können Sie die worktype aus dem übergeordneten Kontext verwenden:

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

Siehe this fiddle für eine funktionierende Demo.

+0

cool seine Arbeit, können Sie mir erklären, warum" string.Empty "wurde genommen –

+0

Ein Name in XML ist gemacht zwei Teile: ein Namespace und ein lokaler Name. 'string.Empty' oder' "" wird hier verwendet, weil die Namen in Ihrem XML keinen Namespace haben. –

0

eine geschachtelte Schleife verwenden. Zunächst wird der Arbeitsknoten mit configuration/company/work abzurufen. abrufen des Werktyp-Attribut und Speichern in einer variablen. Dann Schleife durch die Kind Diktatart Knoten und eine Zeichenkette in der Liste hinzuzufügen für jede

+0

versuchte das selbe, aber wenn ich foreach Schleife für Konfiguration/Firma/Arbeit/Arbeitszeit mache, addiert es doppelten Eingang für gleichen worktype, bedeutet oben sind 2 Aufzeichnungen für homeWork - ich erhält 4 Aufzeichnungen für es, das seine 2 eigene und andere einschließt 2 Datensätze von officeWork –

+0

können Sie Code für die gleichen –

0

Verwenden Sie die Net Library enhanced xml (linq xml)

+0

Dank seiner Arbeit, aber ich muss es mit xPathNavigator tun –

+0

Ich mag nicht mit 3rd Party Dlls, die Viren enthalten können. – jdweng

+1

@jdweng yeah, dass 'System.Xml.dll' von Microsoft ist oft bekannt, dass mit Viren zu verschicken;) –