使用HTML Agility Pack解析父级和后代标记

时间:2014-04-02 05:33:28

标签: html asp.net html-agility-pack

我正在尝试使用HTML Agility Pack解析HTML表单。它适用于以下代码: <p>Some Text</p> 但是假设我有这个: <p>Some Text in p Tag<span>Some text in span tag.</span> Again some text in p tag</p>

我正在使用HtmlNode nodeItem in htmlDoc.DocumentNode.Descendants(controlName).ToArray()来获取控件的所有值(在我们的示例中为p和span)。但这只是获得跨越的文本。

我如何获得这两个标准的值 - “p”和“span”。

更新: 我正在尝试开发一个多语言应用程序,其中资源文件和密钥是通过代码生成的。在上面的示例中:我需要创建3个键:1-“p Tag中的某些文本”,2-“span标记中的某些文本”。和3-“再一些p标签中的文字。”我该如何创建这些键。 当前场景是,它为span标签创建密钥而不是p标签。

提前致谢

1 个答案:

答案 0 :(得分:2)

实际上问题不是很清楚。您应该发布更多相关代码,说明您是如何尝试获得<p><span>的价值的。

这个版本在<p><span>

中都可以正常使用
var html = @"<p>Some Text in p Tag<span>Some text in span tag.</span> Again some text in p tag</p>";
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
foreach (HtmlNode nodeItem in htmlDoc.DocumentNode.Descendants("p").ToArray())
{
    Console.WriteLine(nodeItem.InnerText);
}
foreach (HtmlNode nodeItem in htmlDoc.DocumentNode.Descendants("span").ToArray())
{
    Console.WriteLine(nodeItem.InnerText);
}

这个单foreach循环产生的输出相同:

foreach (HtmlNode nodeItem in 
                htmlDoc.DocumentNode
                       .SelectNodes("//*[name() = 'p' or name() = 'span']"))
{
    Console.WriteLine(nodeItem.InnerText);
}

或者,如果您真的不关心标记名称,可以按照以下方式获取所有元素:

foreach (HtmlNode nodeItem in 
                htmlDoc.DocumentNode
                       .SelectNodes("//*"))
{
    Console.WriteLine(nodeItem.InnerText);
}

如果以上样本均不适用于您的案例,请更新问题以进一步澄清您尝试解决的实际问题。