2012-04-03 6 views
0

Ich habe eine xml, von dem mir einige Informationen über LINQ-Abfrage zu extrahieren versuchen.
Das Format der XML-Datei sieht wie folgt aus:LINQ-Abfrage Inhalt von XML-Klasse zu analysieren

<TopNode> 
    <Sample name="Tom" id="0" batch="1"> 
    <Sequences> 
     <NextItem id="10">Stand1 &gt;</NextItem> 
     <PreviousItem id="9">Stand2 &gt;</PreviousItem> 
    </Sequences> 
    </Sample> 
    <Sample name="Hill" id="1" batch="1"> 
    <Sequences> 
     <NextItem id="1">Stand1 &gt;</NextItem> 
     <NextItem id="2">Stand3 &gt;</NextItem> 
     <PreviousItem id="3">Stand4 &gt;</PreviousItem> 
    </Sequences> 
    </Sample> 
. 
. 
. 
</TopNode> 

ich sowohl eine Liste der Attribute von NextItem bekommen haben und PreviousItem aus der Abfrage. Dafür habe ich eine Klasse definiert, um meine Ergebnisse zu erhalten.

public class Extract 
{ 
public string name 
{ 
get; 
set; 
} 
public int _id 
{ 
get; 
set; 
} 
} 

LINQ Query (foreach Beispielknoten, die PreviousItem und NextItem Inhalt in Klassenobjekt erhalten):

var EnumerableContent = from item in XElement.Load("file.xml").Elements("NextItem") 
       select ???... 

Das Problem ist, wie gehe ich die Daten an die Klasse hier in der obigen Abfrage-Objekte für jeden Sample-Knoten.
. Zweitens wird das oben nur mir NextItem-Knoten erhalten. Wie schreibe ich die Abfrage für NextItem und PreviousItem?

EDIT Im Großen und Ganzen muss ich für jede für jede der Sequence Knoten ein IEnumerable erhalten, und dann wieder die Gesamt IEnumerable von thie Abfrage.

EDIT2 Zuordnung key gibt mir diesen Fehler. Abfrage unter

var mapping = XDocument.Load("file.xml") 
          .Descendants("Sequences") 
          .Select(n => n.Descendants("PreviousItem") 
           .Union(n.Descendants("NextItem")) 
           .Select(n1 => new Extract { _id = (int)n1.Attribute("id"), Name = n1.Value }) 
          ).ToDictionary<IEnumberable<Menu>, int>(key => key._id);//and further converting this dictionary to sorted dictionary (sorted accordign to keys) 

Antwort

1
var xDoc = XDocument.Load(....); 
var result = xDoc.Descendants("NextItem") 
    .Union(xDoc.Descendants("PreviousItem")) 
    .Select(n => new {ID = n.Attribute("id").Value, Name =n.Name, Value =n.Value }); 

--EDIT- -

var result = XDocument.Load(....) 
      .Descendants("Sequences") 
      .Select(n=> n.Descendants("NextItem") 
       .Union(n.Descendants("PreviousItem")) 
       .Select(n2 => new { ID = n2.Attribute("id").Value, Name = n2.Name, Value = n2.Value }) 
      ); 
+0

Das gibt mir die IEnumerable für jeden der NextItem und PreviousItem in der XML-Datei. Was ich will, ist eigentlich, dass für jede der Sequenzknoten, sollte ich eine enumberable erzeugen und dann eine Gesamt IEnumberable der oben zurückzukehren. Ich hoffe, ich kann das Problem vermitteln. ; -/ – Cipher

+0

@Cipher Ich habe die Antwort aktualisiert, ich hoffe ich habe dich richtig verstanden. –

+0

Danke! Ja, aber der Grund, warum ich schrieb eine Extarct Klasse war, dass ich das Ergebnis in einem Wörterbuch danach heißt '.ToDictionary ' 'wo TValue' könnte der Extrakt Klasse IEnumberable umwandeln wollte. In der obigen Aussage, ich bin nicht in der Lage '.Select (neu Menu {SeekPoint = (int) n1.Attribute ("Zeit"), Neuertext = n1.Value})' – Cipher

1

Ich bin mir nicht sicher, ob ich die Frage verstanden, aber man kann leicht Element/Attribut-Wert innerhalb LINQ to XML select Anweisung nehmen:

var EnumerableContent = from item in XElement.Load("file.xml").Elements("NextItem") 
       select new Extract() { name = item.Value, _id = (int)item.Attribute("id") } 
+0

Ich bekomme nur 'NextItem' Elemente, aber ich möchte die Abfrage ändern die gleiche Sache für die' PreviousItem' Knoten zu erhalten. ; -/ Das Problem ist, dass ich eine separate IEnumerable von 'PreviousItem' und' NextItem' für jeden der 'Sequence' Knoten in XML erhalten möchten, und geben die Gesamt IEnumberable – Cipher

0

hallo ich denke das ist was du ex pect.

List<XElement> lstXElements = new List<XElement>(); 
     lstXElements.AddRange(GetDescendants("NextItem")); 
     lstXElements.AddRange(GetDescendants("PreviousItem")); 

     List<Extract> lstExtract = new List<Extract>(); 

     foreach (XElement objElement in lstXElements) 
     { 
      Extract objExtract = new Extract(); 
      objExtract._id = Convert.ToInt32(objElement.Attribute("id").Value); 
      objExtract.name = (objElement.Name).LocalName; 
      lstExtract.Add(objExtract); 
     } 
List<XElement> GetDescendants(string strDescentName) 
    { 
     return ((XDocument.Load(Server.MapPath("XMLFile1.xml")) 
      .Descendants(strDescentName)) 
      ).ToList<XElement>(); 
    } 
Verwandte Themen