仅获取此节点的 InnerText,不包括子节点
Get only InnerText of this node excluding children
由于我对 XPath 还不太熟悉,所以我更喜欢使用 HtmlAgilityPack
的 LINQ。我认为这是我需要 XPath 解决方案的情况之一。所以我需要你的帮助。
考虑这个简化的 HTML 片段:
<td><b>Billing informations:</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
。有时文本在一个跨度中,有时像这里一样直接在单元格中。所以我需要一种在这两种情况下都适用的方法。
我试过这个:
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
return 是最外层单元格的 InnerText
,而不是包含 Invoice-Number
的单元格。所以 text
也包含 "Billing informations":
Billing informations:
Invoice-Number:1534753Transactioncode: 1WF772582A4041818
虽然我可以使用字符串方法或正则表达式来提取这两个值,但在这种情况下,这是非常容易出错的,因为较大的 html 页面包含许多嵌套表格。我只想要最里面单元格的 InnerText
。也许还有一个 LINQ 解决方案可以解决这个问题,那么我更喜欢它。
Update 我注意到使用 LastOrDefault
而不是 FirstOrDefault
可能是一个可行的解决方法,因为这似乎 return 最里面符合条件的单元格:
var invoiceCell = doc.DocumentNode.Descendants("td")
.LastOrDefault(cell => cell.InnerText.Contains("Invoice-Number"));
这是另一种使用 XPath 来涵盖这两种情况的替代方法——当目标文本直接位于单元格内时,当目标文本包含在跨度中时:
var xpath = "//td[contains(text(),'Invoice-Number') or contains(span,'Invoice-Number')]";
var invoiceCell = doc.DocumentNode.SelectSingleNode(xpath);
由于我对 XPath 还不太熟悉,所以我更喜欢使用 HtmlAgilityPack
的 LINQ。我认为这是我需要 XPath 解决方案的情况之一。所以我需要你的帮助。
考虑这个简化的 HTML 片段:
<td><b>Billing informations:</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
。有时文本在一个跨度中,有时像这里一样直接在单元格中。所以我需要一种在这两种情况下都适用的方法。
我试过这个:
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
return 是最外层单元格的 InnerText
,而不是包含 Invoice-Number
的单元格。所以 text
也包含 "Billing informations":
Billing informations:
Invoice-Number:1534753Transactioncode: 1WF772582A4041818
虽然我可以使用字符串方法或正则表达式来提取这两个值,但在这种情况下,这是非常容易出错的,因为较大的 html 页面包含许多嵌套表格。我只想要最里面单元格的 InnerText
。也许还有一个 LINQ 解决方案可以解决这个问题,那么我更喜欢它。
Update 我注意到使用 LastOrDefault
而不是 FirstOrDefault
可能是一个可行的解决方法,因为这似乎 return 最里面符合条件的单元格:
var invoiceCell = doc.DocumentNode.Descendants("td")
.LastOrDefault(cell => cell.InnerText.Contains("Invoice-Number"));
这是另一种使用 XPath 来涵盖这两种情况的替代方法——当目标文本直接位于单元格内时,当目标文本包含在跨度中时:
var xpath = "//td[contains(text(),'Invoice-Number') or contains(span,'Invoice-Number')]";
var invoiceCell = doc.DocumentNode.SelectSingleNode(xpath);