使用LINQ进行XML数据提取
问题描述:
我试图使用LINQ语句从网站中提取一些数据,XML格式如下。使用LINQ进行XML数据提取
<parent>
<p>
<b>
Title
</b>
</p>
<p>
blurb
</p>
<p>
<b>
As Of Date
</b>
</p>
<center>
<table>
<tr>
<th>
Header
</th>
</tr>
<tr>
<td>
Data
</td>
</tr>
</table>
</center>
<p>
<b>
As Of Date
</b>
</p>
<center>
<table>
<tr>
<th>
Header
</th>
</tr>
<tr>
<td>
Data
</td>
</tr>
</table>
</center>
</p>
我想获得的截止日期和数据(数据行被重复多次)。此外,表格和截至日期在文档中多次出现(表格从日期开始生效)。
我可以使用下面的LINQ让行,但我如何才能在截止日期
Dim l_PricesTable = From rows In l_Xml.Descendants("tr") _
Where ((rows.Descendants("td") IsNot Nothing) AndAlso (rows.Descendants("td").Count >= 1)) _
Select Data = rows.Descendants("td")(0).Value,
AsOfDate = ???
我没有改变XML,因为它是一个第三方源的方式。没有包含日期和表的XML元素,它们都在一个父节点下。
我对C#和VB.Net充满信心,所以任何解决方案都可以。
任何帮助,将不胜感激。
感谢
戴夫
答
我已经以非常混乱的方式解决了这个问题,但由于没有其他答案即将出版,我会发布我所做的。
Dim l_PricesTable = From rows In l_Xml.Descendants("tr") _
Where ((rows.Descendants("td") IsNot Nothing) AndAlso (rows.Descendants("td").Count >= 1)) _
Select Data = rows.Descendants("td")(0).Value,
AsOfDate = rows.Parent.Parent.ElementsBeforeSelf("p")(rows.Parent.Parent.ElementsBeforeSelf("p").Count - 1).Descendants("b").Value
答
不要使用XML库来解析HTML。语法相似,但不一样。 XHTML是XML,HTML不是。这就是说,你上面的示例数据是与XML兼容的HTML,所以如果所有数据看起来像这样(并且不使用任何非结束标签,如img
),那么你应该是能够滑行。
假设字符串“截止日期”你上面的例子中是你真正想要检索什么的占位符,则:
Dim asOfDate = l_Xml.Elements("p")(2).Element("b").Value
要知道从屏幕的固有脆性,这个遭受刮;如果设计完全改变,你的过程就会中断。
谢谢,我知道这是脆弱的,可悲的是这是唯一的方法。我选择了LINQ,因为它是一个整洁的网站(它并不经常改变,我意识到我只是诅咒了这一点),它比字符串迭代更容易。可悲的是,这并不能解决问题,因为数据迭代(我已经在问题中做了更清晰的说明)。 – DJIDave 2010-12-06 15:11:55