2017-01-04 240 views
0

我有如下所示的XML。我正在尝试使用LINQ解析C#。Linq查询解析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> 

当我尝试使用以下查询获取<sPack>元素。

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

我得到它正在的<sPack>所有的实例:

<servers> 
    <server> 
     <sPack> 

我要的是让<sPack>其自带<software>和解析<servers>一个单独的查询下。

+0

你可能会考虑XPath。它和selectNodes一样简单(“/ servers/servers/server/sPack”) –

回答

3

你可以简单地使用xDoc.Root.Elements("sPack")选择根元素的sPack子元素(一个或多个),然后xDoc.Root.Elements("servers").Elements("server").Elements("sPack")选择server元素(S)的sPack后裔。

0

sPack元素作为查询的一部分software的后代。由于software是根元素,所有元素都是子孙。示例in the docs显示了此查询的工作方式。

你想要的是Elements,它只返回孩子元素,它不涉及任何递归。

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

对于你的第二个查询,您希望通过所有元素进行递归搜索。所以Descendants在这里是适当的:

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