2016-12-19 3 views
0

Ich habe mit C# gearbeitet und würde gerne wissen, wie der einfachste Weg wäre, jede ID von <lib> zu finden ?, ich bin wirklich neu in C# selbst und vor allem XML, also würde ich mich über Hilfe freuen.C# XML foreach Element?

C#

var xmlData = client.DownloadString(figureMapUrl); 
var doc = XDocument.Parse(xmlData); 

XML:

<map> 
    <lib id="myid1" revision="1"> 
     <part id="2732" type="ch"/> 
     <part id="2732" type="ls"/> 
     <part id="2732" type="rs"/> 
     <part id="2733" type="ch"/> 
    </lib> 
    <lib id="myid2" revision="2"> 
     <part id="2732" type="ch"/> 
     <part id="2732" type="ls"/> 
     <part id="2732" type="rs"/> 
     <part id="2733" type="ch"/> 
    </lib> 
</map> 
+0

Um dies in eine überschaubare Weise zu analysieren Sie können in Klassen deserialisieren, aber das auf, was Sie würden versuchen zu tun. – vipersassassin

+0

Ich würde dem Kommentar über das Deserialisieren in ein Objekt zustimmen. Ihr Beispiel gibt auch zwei verschiedene Entitäten, die ein "ID" -Attribut haben. Ist ein einzelnes großes Array mit allen "ID" -Werten drin, wonach Sie suchen? –

+0

Ja, das bin ich nach –

Antwort

0

Try 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 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      var results = doc.Descendants("lib").Select(x => new 
      { 
       id = (string)x.Attribute("id"), 
       revision = (int)x.Attribute("revision"), 
       parts = x.Elements("part").Select(y => new 
       { 
        id = (int)y.Attribute("id"), 
        type = (string)y.Attribute("type") 
       }).ToList() 
      }).ToList(); 

      foreach (string id in results.Select(x => x.id).ToArray()) 
      { 
      } 

      foreach (var part in results.Select(x => x.parts)) 
      { 
       foreach (int id in part.Select(y => y.id).ToArray()) 
       { 
       } 
      } 
     } 
    } 
} 
+0

Gibt es eine Möglichkeit, eine Zeichenfolge der "ID" hier zu liefern? –

+0

Ja. Ich habe den Code aktualisiert, um ein Beispiel zu geben. – jdweng

0

Sie suchen LINQ to XML suchen. Ich versuche nicht, diesen Code selbst, sondern von der Spitze meiner Meinung wäre es so etwas wie:

// getting first level ids using LINQ to XML 
var libIds = from lib in doc.Descendants("lib") 
select new { id = lib.Attribute("id").Value }; 

// getting second level ids using LINQ to XML 
var partIds = from lib in doc.Descendants("lib") 
from part in lib.Descendants("part") 
select new { value = part .Attribute("id").Value }; 

Jetzt libIds und partIds sind IEnumerable<string>. Sie können eine .ToList() machen, um sie in Listen umzuwandeln.

EDIT

Dies ist, wie Sie die ids iterieren:

foreach(var id in partIds) Console.WriteLine(id); 
+0

Gibt es irgendeine Möglichkeit, eine Zeichenfolge der "ID" hier zu foreach? –

+0

@VoiDHD, sicher, aktualisiert die Antwort für Klarheit –

0

Ein wenig mehr XML-basierten Ansatz wie folgt aussehen würde. Keine Notwendigkeit für POCO hier.

XmlDocument xml = new XmlDocument(); 
xml.loadXML(strXMLString); 
foreach(XmlElement ndLib in xml.selectNodes("//lib")) { 
    string strID = ndLib.getAttribute("id"); 
    string strRevision = ndLib.getAttribute("revision"); 
} 
+0

Gibt es eine Möglichkeit, ich kann hier eine Zeichenfolge der "ID" Foreach? –

+0

foreach (XmlNode ndID in xml.selectNodes ("// lib/@ id")) {...} –

0

Mit LINQ to XML, Sie Folgendes tun können:

var xmlData = client.DownloadString(figureMapUrl); 
var doc = XDocument.Parse(xmlData); 

var idList = doc.Descendants("lib").Select(el => el.Attribute("id").Value).Union(
      doc.Descendants("part").Select(el => el.Attribute("id").Value)) 
      .ToList(); 

Extra: wenn Sie die Wiederholungen vermeiden:

var idList = doc.Descendants("lib").Select(getId).Union(
      doc.Descendants("part").Select(getId)) 
      .ToList(); 

string getId(XElement el) => el.Attribute("id").Value; 

Schleife über diese Sie könnten eine regelmäßige for-Schleife:

foreach(var id in idList) 
{ 
    // Do something with ID here 
} 

oder alternativ könnten Sie ForEach und beseitigen die Variable zusammen verwenden:

doc.Descendants("lib").Select(getId).Union(
doc.Descendants("part").Select(getId)) 
    .ToList() 
    .ForEach(id => { 
     // Do something with id here 
    }); 
+0

Gibt es eine Möglichkeit, eine Zeichenfolge der "ID" hier zu foreach? –

+0

Ja, mit einer 'foreach'-Schleife oder der'.ForEach'-Erweiterungsmethode (siehe aktualisierte Antwort) – Kenneth