2017-01-04 1 views
0

Ich habe die XML unten gezeigt. Ich versuche, C# mit LINQ zu analysieren.Linq Abfrage zu Parse XML

<software> 
    <version>31.0.1</version> 
    <status>uptime 2d 22h 39m 26s</status> 
    <wPack> 
     <rv> 
      <total>0</total> 
      <qv>0</qv> 
     </rv> 
     <sv> 
      <total>0</total> 
      <qv>0</qv> 
     </sv> 
    </wPack> 
    <sPack> 
     <rv> 
      <total>242</total> 
      <qv>1</qv> 
     </rv> 
     <sv> 
      <total>69845</total> 
      <qv>145</qv> 
     </sv> 
     <size>146</size> 
    </sPack> 
    <dPack> 
     <rv> 
      <total>88560</total> 
     </rv> 
     <sv> 
      <total>0</total> 
     </sv> 
     <in>0.28,0.23,0.35</in> 
     <out>0.00,0.00,0.00</out> 
     <qv>216806</qv> 
     <db>mysql</db> 
    </dPack> 
    <bClients> 
     <bClient> 
      <type>sPackbClient</type> 
      <id>test1</id> 
      <IP>127.0.0.1</IP> 
      <queue>0</queue> 
      <status>on-line 2d 22h 39m 21s</status> 
      <ssl>no</ssl> 
     </bClient> 
     <bClient> 
      <type>sPackbClient</type> 
      <id>test2</id> 
      <IP>127.0.0.1</IP> 
      <queue>0</queue> 
      <status>on-line 2d 22h 39m 18s</status> 
      <ssl>no</ssl> 
     </bClient> 
     <bClient> 
      <type>sPackbClient</type> 
      <id>test3</id> 
      <IP>127.0.0.1</IP> 
      <queue>0</queue> 
      <status>on-line 0d 2h 33m 30s</status> 
      <ssl>no</ssl> 
     </bClient> 
    </bClients> 
    <servers> 
     <server> 
      <name>EC1</name> 
      <admin-id>EC1</admin-id> 
      <id>EC1</id> 
      <status>online 8901s</status> 
      <failed>0</failed> 
      <qv>0</qv> 
      <sPack> 
       <rv>0</rv> 
       <sv>0</sv> 
       <in>0.00,0.00,0.00</in> 
       <out>0.00,0.00,0.00</out> 
      </sPack> 
      <dPack> 
       <rv>0</rv> 
       <sv>0</sv> 
       <in>0.00,0.00,0.00</in> 
       <out>0.00,0.00,0.00</out> 
      </dPack> 
     </server> 
     <server> 
      <name>EC2</name> 
      <admin-id>EC2</admin-id> 
      <id>EC2</id> 
      <status>online 8918s</status> 
      <failed>2</failed> 
      <qv>0</qv> 
      <sPack> 
       <rv>79</rv> 
       <sv>20843</sv> 
       <in>0.00,0.00,0.00</in> 
       <out>0.06,0.05,0.08</out> 
      </sPack> 
      <dPack> 
       <rv>35050</rv> 
       <sv>0</sv> 
       <in>0.10,0.07,0.14</in> 
       <out>0.00,0.00,0.00</out> 
      </dPack> 
     </server> 
     <server> 
      <name>EC3</name> 
      <admin-id>EC3</admin-id> 
      <id>EC3</id> 
      <status>re-connecting</status> 
      <failed>0</failed> 
      <qv>0</qv> 
      <sPack> 
       <rv>4</rv> 
       <sv>1671</sv> 
       <in>0.00,0.00,0.00</in> 
       <out>0.00,0.00,0.00</out> 
      </sPack> 
      <dPack> 
       <rv>1664</rv> 
       <sv>0</sv> 
       <in>0.00,0.00,0.00</in> 
       <out>0.00,0.00,0.00</out> 
      </dPack> 
     </server> 
    </servers> 
</software> 

Wenn ich versuche, <sPack> Elemente mit folgenden Abfrage zu erhalten.

var software = (from sw in xDoc.Descendants("software") 
       from sp in sw.Descendants("sPack") 
       select sp).ToList(); 

ich alle Instanz von <sPack>, die sind unter:

<servers> 
    <server> 
     <sPack> 

Was ich will, ist <sPack> zu erhalten, die für die Analyse <servers> unter <software> und eine separate Abfrage kommt.

+0

Sie könnten stattdessen XPath berücksichtigen. Es ist so einfach wie selectNodes ("/ servers/servers/server/sPack") –

Antwort

3

Sie könnten einfach xDoc.Root.Elements("sPack") verwenden, um das sPack Kind-Element (e) des Root-Elements auszuwählen und dann xDoc.Root.Elements("servers").Elements("server").Elements("sPack") die sPack Nachkommen des server Elements auszuwählen (s).

0

Das Element sPack, das Sie als Teil Ihrer Abfrage erhalten ist ein Nachkomme von software. Da software das Wurzelelement ist, sind alle darin enthaltenen Elemente Nachkommen. Das Beispiel in the docs zeigt, wie diese Abfrage funktioniert.

Was Sie wollen, ist Elements, die nur die Kind Elemente zurückgibt, es beinhaltet keine Rekursion.

var software = xDoc.Elements("software").Elements("sPack"); 

Für Ihre zweite Abfrage, Sie tun rekursiv durch alle Elemente gesucht werden soll. So ist Descendants hier angebracht:

var servers = xDoc.Descendants("servers").Descendants("sPack");