微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 只获取此节点的InnerText,不包括子节点

由于我还不熟悉XPath,我更喜欢LINQ和 HtmlAgilityPack.我认为这是我需要XPath解决方案的情况之一.所以我需要你的帮助.

@H_502_6@

考虑这个简化的HTML片段:@H_502_6@

@H_502_6@

<td><b>Billing @R_348_4045@ions:</b>
    <table>
        <tr>
            <td style="color: #757575; padding-left: 10px; padding-bottom: 20px;">
                Invoice-Number:1534753<br />Transactioncode: 1WF772582A4041717
            </td>
        </tr>
    </table>
</td>

这是更大的HTML页面的一部分,但它演示了我的问题.我需要提取Invoice-Number和TransactionCode.有时文本是跨度的,有时直接在单元格中,就像这里一样.所以我需要一种适用于这两种情况的方法.@H_502_6@

我试过这个:@H_502_6@

@H_502_6@

var invoiceCell = doc.DocumentNode.Descendants("td")
    .FirstOrDefault(cell => cell.InnerText.Contains("Invoice-Number"));
if (invoiceCell != null)
{
    string text = invoiceCell.InnerText;
    // use string methods to extract both values
}

问题是invoiceCell.InnerText返回最外层单元格的InnerText,而不是包含Invoice-Number的单元格.因此,文本还包含“结算信息”:@H_502_6@

@H_502_6@

Billing @R_348_4045@ions:



                Invoice-Number:1534753Transactioncode: 1WF772582A4041818

虽然在这种情况下我可以使用字符串方法或正则表达式来提取两个值,但由于较大的html页面包含许多嵌套表,因此非常容易出错.我只想要最内层单元格的InnerText.也许还有一个LINQ解决方案来解决这个问题,然后我更喜欢这个.@H_502_6@

更新我注意到使用LastOrDefault而不是FirstOrDefault可能是一个可行的解决方法,因为它似乎返回匹配条件的最内层单元格:@H_502_6@

@H_502_6@

var invoiceCell = doc.DocumentNode.Descendants("td")
    .LastOrDefault(cell => cell.InnerText.Contains("Invoice-Number"));

解决方法

下面是使用XPath覆盖这两种情况的另一种方法 – 当目标文本直接位于单元格内部时,以及当它包含在跨度中时:

@H_502_6@

@H_502_6@

var xpath = "//td[contains(text(),'Invoice-Number') or contains(span,'Invoice-Number')]";
var invoiceCell = doc.DocumentNode.SelectSingleNode(xpath);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐