2017-02-28 1 views
0

Angenommen, ich habe das folgende XML-Format.mit Auswahl innerhalb von

<data> 
    <appName>Microsoft Word</appName> 
    <appId>123</appId> 
</data> 

Wo gibt es mehr Daten Bäume im XML, habe ich den folgenden Code, um eine Liste von Datenobjekten zu bauen.

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
     } 
    ).ToList(); 

aber ich laufe in Probleme, wenn ich einen weiteren Baum unter dem Daten-Tag hinzufügen, etwa so:

<data> 
    <appName>Microsoft Word</appName> 
    <appId>123</appId> 
    <appOptions> 
      <Win7Compat>true</Win7Compat> 
      <Win7x64Compat>false</Win7x64Compat> 
    </appOptions> 
</data> 

Und ich verwende den folgenden Code:

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
      appOptions = 
      (
       from appNode in dataNode.Elements("appOptions") 
       select new AppOptionsObj 
       { 
        win7Compat = appNode.Element("Win7Compat"), 
        win7x64Compat = appNode.Element("Win7x64Compat") 
       } 
      ) as AppOptionsObj, 
     } 
    ).ToList(); 

Mein appOptions-Objekt wird immer als null behandelt. Ich habe das Gefühl, dass ich den Unterbaum nicht richtig analysiere.

+0

Sollte es nicht sein 'von appNode in dataNode.Element ("appOptions")' (single)? Was Sie gepostet haben, ist kein gültiges XML. 'Win7Compat' und das nächste Geschwister nicht geschlossen. –

+0

Ich glaube nicht, dass dies der Code ist, den Sie ausgeführt haben - hier gibt es klare Syntaxfehler und Tippfehler. Sie müssen uns den Code zeigen, mit dem Sie arbeiten, wenn Sie Hilfe benötigen. Der Code wie gepostet würde nur eine Reihe von Fehlern geben. – Hogan

+0

Warum deserialisieren Sie dieses XML einfach nicht zu einem Objekt? –

Antwort

2

Das Problem ist, dass Sie mit as AppOptionsObj aber Ihrem Select als Casting tatsächlich in einem null ein IEnumerable<AppOptionsObj> so das Gussergebnis zurückkehren. Sie wollen wahrscheinlich SingleOrDefault() verwenden, um die einzelne Instanz zurückzukehren statt:

List<DataObj> dataObjList = 
    (
     from dataNode in xmlDoc.Elements("data") 
     select new DataObj 
     { 
      appName = dataNode.Element("appName"), 
      appId = dataNode.Element("appId") 
      appOptions = 
      (
       from appNode in dataNode.Elements("appOptions") 
       select new AppOptionsObj 
       { 
        win7Compat = appNode.Element("Win7Compat"), 
        win7x64Compat = appNode.Element("Win7x64Compat") 
       } 
      ).SingleOrDefault(), 
     } 
    ).ToList(); 
+0

Arbeitete perfekt! Vielen Dank. – LeoVannini

Verwandte Themen