来自这个XHTML来源:
<div class = "page">
<h1>UNIQUE NAME</h1>
<table>
<tbody>
<tr>
<td>DATA TO EXTRACT 1</td>
</tr>
<tr>
<td />
<td />
<td />
<td />
<td />
<td>DATA TO EXTRACT 2</td>
</tr>
</tbody>
</table>
etc...
UNIQUE NAME有多个具有类似子元素集的实例。
我需要找到UNIQUE NAME元素并提取每个子元素标签中的所有值(DATA TO EXTRACT)。另外,我需要记住每个值的位置。例如,DATA TO EXTRACT 1将在tr 1,td 1. DATA TO EXTRACT 2将在tr 2,td 6。
我是linq to xml的新手,我想知道是否有人可以指出我在策略方面的正确方向。我已经设法找出如何使用以下代码获取UNIQUE名称元素:
var choice1 = (from category in _data.Descendants("div")
where category.Element("h1").Value == "UNIQUE NAME"
select category).DescendantNodes();
这会返回一组值,我相信我可以循环使用,但我相信必须有更优雅的方法来实现这个目标。
非常感谢!
答案 0 :(得分:0)
以下是使用LINQ进行此操作的一种方法:
var choice1 =
from category in _data.Descendants("div")
where category.Element("h1").Value == "UNIQUE NAME"
from row in category.Descendants("tr").Select((element, index) => new { element, index })
from col in row.element.Elements("td").Select((element, index) => new { element, index })
where !string.IsNullOrEmpty(col.element.Value)
select new
{
RowIndex = row.index + 1, // one-based index
ColIndex = col.index + 1,
Value = col.element.Value,
};
如何使用结果的示例:
foreach (var v in choice1)
Console.WriteLine(string.Format(
"RowIndex = {0}, ColIndex = {1}, Value = \"{2}\".",
v.RowIndex, v.ColIndex, v.Value));
...将输出:
RowIndex = 1, ColIndex = 1, Value = "DATA TO EXTRACT 1".
RowIndex = 2, ColIndex = 6, Value = "DATA TO EXTRACT 2".