1

我正在尝试使用 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) 的行。显然我找不到它,或者我不会在这里问。谢谢!

4

1 回答 1

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 方法来查看操作的输出。

于 2013-03-31T10:22:49.513 回答