C# 基于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&

我试图使用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>
我无法更改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