我正在尝试使用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)。显然我找不到,或者我不会在这里问。谢谢!
答案 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方法来查看操作的输出。