如何使用LINQ在特定节点之间获取XML元素

时间:2013-03-23 23:53:06

标签: vb.net linq

我正在尝试使用LINQ(vb.net)处理一些XML以返回两个特定行之间的所有行:

XML:

<ss:Table>
   <ss:Row ss:FirstRow="true">...</ss:Row>
   <ss:Row>1</ss:Row>
   <ss:Row>2</ss:Row>
   <ss:Row>3</ss:Row>
   <ss:Row ss:LastRow="true">...</ss:Row>
</ss:Table>

我可以使用以下内容获取起始行:

Dim Rows = From item In dg...<Table>...<Row> Select item Where item.@ss:FirstRow = "true"

但我敢打赌,有一种LINQ优雅的方式来获取行(1,2,3)。显然我找不到,或者我不会在这里问。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你是在使用ElementsAfterSelf和TakeWhile两个函数来完成这个伎俩。抱歉我的回答是在C#中。

var xml = @"
<Table>
    <Row FirstRow='true'>bob</Row>
    <Row>1</Row>
    <Row>2</Row>
    <Row>3</Row>
    <Row LastRow='true'>bob</Row>
    <Row FirstRow='true'>mary</Row>
    <Row>4</Row>
    <Row>5</Row>
    <Row>6</Row>
    <Row LastRow='true'>mary</Row>
    <Row FirstRow='true'>jane</Row>
    <Row>7</Row>
    <Row>8</Row>
    <Row>9</Row>
    <Row LastRow='true'>jane</Row>
</Table>";

var doc = XDocument.Parse(xml);
var rows = (from row in doc.Root.Elements("Row")
            where row.Attribute("FirstRow") != null
            select new
            {
                Name = row.Value,
                Values = row.ElementsAfterSelf().TakeWhile(n => n.Attribute("LastRow") == null).ToList()
            }).ToList();

rows.Dump();

我使用LinqPad汇总答案,因此最后调用Dump方法来查看操作的输出。