C# 基于LINQ的XML数据提取
我试图使用LINQ语句从网站中提取一些数据,XML的格式如下C# 基于LINQ的XML数据提取,c#,vb.net,linq,C#,Vb.net,Linq,我试图使用LINQ语句从网站中提取一些数据,XML的格式如下 <parent> <p> <b> Title </b> </p> <p> blurb </p> <p> <b> As Of Date </b> </p> <center> <table&
<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>
我无法更改XML,因为它是第三方源代码。没有只包含截止日期和表的XML元素,它们都位于一个父节点下
我对C#和VB.Net很有信心,所以任何解决方案都可以
任何帮助都将不胜感激
谢谢
Dave不要使用XML库来解析HTML。语法类似,但不相同。XHTML是XML,HTML不是 也就是说,上面的示例数据是与XML兼容的HTML,因此,如果所有数据都是这样的(并且不使用任何非结束标记,如
img
),那么您应该能够顺利通过
假设上述示例中的字符串“截止日期”是您实际要检索的内容的占位符,则:
Dim asOfDate = l_Xml.Elements("p")(2).Element("b").Value
请注意,这是由于屏幕刮擦固有的脆弱性造成的;如果设计发生任何变化,您的过程将中断。我以一种非常混乱的方式解决了这个问题,但由于没有其他答案,我将发布我所做的
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
谢谢,我意识到这件事的脆弱性,不幸的是,这是唯一的办法。我选择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 = rows.Parent.Parent.ElementsBeforeSelf("p")(rows.Parent.Parent.ElementsBeforeSelf("p").Count - 1).Descendants("b").Value