2010-12-06 70 views
0

我试图使用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充满信心,所以任何解决方案都可以。

任何帮助,将不胜感激。

感谢

戴夫

回答

0

我已经以非常混乱的方式解决了这个问题,但由于没有其他答案即将出版,我会发布我所做的。

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 
1

不要使用XML库来解析HTML。语法相似,但不一样。 XHTML是XML,HTML不是。这就是说,你上面的示例数据是与XML兼容的HTML,所以如果所有数据看起来像这样(并且不使用任何非结束标签,如img),那么你应该是能够滑行。

假设字符串“截止日期”你上面的例子中是你真正想要检索什么的占位符,则:

Dim asOfDate = l_Xml.Elements("p")(2).Element("b").Value 

要知道从屏幕的固有脆性,这个遭受刮;如果设计完全改变,你的过程就会中断。

+0

谢谢,我知道这是脆弱的,可悲的是这是唯一的方法。我选择了LINQ,因为它是一个整洁的网站(它并不经常改变,我意识到我只是诅咒了这一点),它比字符串迭代更容易。可悲的是,这并不能解决问题,因为数据迭代(我已经在问题中做了更清晰的说明)。 – DJIDave 2010-12-06 15:11:55