2016-07-26 2 views
0

Ich versuche, die Werte von einem XElement, das ich von db Benachrichtigung erhalten. Die XML-Struktur ist wie folgt:XElement.Elements() Rückgabe leere Sammlung

<?xml version="1.0"?> 
<root> 
    <inserted> 
     <row> 
      <CODI_AVERIA>22</CODI_AVERIA> 
      <NUMERO_LINIA>2</NUMERO_LINIA> 
      <DIA>2016-07-17T00:00:00</DIA> 
      <HORA>1899-12-30T10:26:15.790</HORA> 
      <CODI_USUARI>1</CODI_USUARI> 
      <ACCIO>0</ACCIO> 
      <CODI_PSEUDO>-1</CODI_PSEUDO> 
     </row> 
    </inserted> 
</root> 

Und das ist die Methode, die ich verwende die Daten zu erhalten, und es gibt mir eine Liste, die leer ist.

static void getAccio(XElement xml) 
{ 
    try 
    { 
     xml.Descendants("deleted").Remove(); 

     var items = xml.Elements("row").Select(n => new 
     { 
      Codi_averia = n.Element("CODI_AVERIA").Value, 
      Numero_linia = n.Element("NUMERO_LINIA)").Value, 
      Accio = n.Element("ACCIO").Value 
     }).ToList(); 
    } 
    catch (Exception e) 
    { 
     Console.Write(e.Message); 
    } 
} 

Ich habe versucht, außer den Wert jedes Feld zu bekommen und es mich ihnen nicht erlaubt, separetly als XElements zu bekommen.

+1

Hat Ihr XML einen Namespace haben? –

+0

ist '' das [root-Element] (https://en.wikipedia.org/wiki/Root_element) Ihrer XML-Datei oder ist es in einem größeren Element enthalten? – dbc

+0

@dbc es hat '' Element nur am Anfang und am Ende der XML, die ich kopiere ... es ist meine Schuld – Narf92

Antwort

0

Verwenden .Descendants() statt .Elements():

var items = xml.Descendants("row").Select(n => new 
    { 
     Codi_averia = n.Element("CODI_AVERIA").Value, 
     Numero_linia = n.Element("NUMERO_LINIA)").Value, 
     Accio = n.Element("ACCIO").Value 
    }).ToList(); 

.Elements findet nur diejenigen Elemente, die direkte Abkömmlinge sind, das heißt sofort Kinder. - Und ich nehme an, dass Ihr XElement das Elternteil des inserted Abschnitts ist.

Für Unterschied zwischen .Element und .Descendantssee this question

Wenn man sie in allen inneren Elementen nicht finden will auch dann tun .Element("inserted").Elements("rows")

+1

Danke, das hat das Problem behoben! – Narf92

+0

Gern geschehen –

0

Ihr Dokument hat kein Root-Element mit dem Namen row. Stattdessen müssen Sie inserted zuerst auswählen und auflisten, um die row Elemente inserted:

var xml = @"<inserted> 
    <row>  
     <CODI_AVERIA>21</CODI_AVERIA>  
     <NUMERO_LINIA>2</NUMERO_LINIA>  
     <DIA>2016-07-17T00:00:00</DIA>  
     <HORA>1899-12-30T10:26:15.790</HORA>  
     <CODI_USUARI>1</CODI_USUARI>  
     <ACCIO>0</ACCIO>  
     <CODI_PSEUDO>-1</CODI_PSEUDO> 
    </row> 
</inserted>"; 

var xdoc = XDocument.Parse(xml); 

var items = xdoc.Element("inserted").Elements("row").Select(n => new 
{ 
    Codi_averia = n.Element("CODI_AVERIA").Value, 
    Numero_linia = n.Element("NUMERO_LINIA").Value, 
    Accio = n.Element("ACCIO").Value 

}).ToList(); 
0

In Ihrem Beispielcode ("NUMERO_LINIA)") wegen zusaetzliche Zitat und Klammer falsch ist.

Dies funktioniert für mich:

XDocument xd = XDocument.Load("XMLFile1.xml"); 

var lst = (from n in xd.Descendants("row") 
      select new 
      { 
       Codi_averia = n.Element("CODI_AVERIA").Value, 
       Numero_linia = n.Element("NUMERO_LINIA").Value, 
       Accio = n.Element("ACCIO").Value 
      }).ToList(); 

foreach (var item in lst) 
    Console.WriteLine(string.Format("{0}{1}{2}", item.Codi_averia, item.Numero_linia, item.Accio));