Linq查询到Parse XML

时间:2017-01-04 14:08:22

标签: c# xml linq linq-to-xml

我有如下所示的XML。我正在尝试使用C#和LINQ解析。

<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>的单独查询。

2 个答案:

答案 0 :(得分:3)

您只需使用xDoc.Root.Elements("sPack")选择根元素的sPack子元素,然后xDoc.Root.Elements("servers").Elements("server").Elements("sPack")选择sPack的{​​{1}}个后代。元素。

答案 1 :(得分:0)

您在查询中获得的software元素是software的后代。由于var software = xDoc.Elements("software").Elements("sPack"); 是根元素,因此其中的所有元素都是后代。示例in the docs显示了此查询的工作原理。

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

Descendants

对于第二个查询,执行希望以递归方式搜索所有元素。所以var servers = xDoc.Descendants("servers").Descendants("sPack"); 在这里是合适的:

{{1}}