Большинство html-парсеров пытаются создать работающий DOM, что означает, что висячие теги не принимаются. Они будут преобразованы или каким-то образом закрыты.
Если для вас важен только выбор узлов, а скорость и огромные объемы данных не являются проблемой, вы можете вместо этого захватить все свои теги
с помощью регулярного выражения:
Regex reMatchP = new Regex(@"<(p)>.*?</\1>");
foreach (Match m in reMatchP.Matches(strHtml))
{
Console.WriteLine(m.Value);
}
Это регулярное выражение предполагает, что теги
правильно сформированы и закрыты.
Если вы часто запускаете это регулярное выражение в своей программе, вы должны объявить его как:
static Regex reMatchP = new Regex(@"<(p)>.*?</\1>", RegexOptions.Compiled);
[Редактировать: Смена пакета ловкости]
Если вы хотите использовать пакет HtmlAgility, вы можете изменить функцию PushNodeEnd в HtmlDocument.cs:
if (HtmlNode.IsCDataElement(CurrentNodeName()))
{
_state = ParseState.PcData;
return true;
}
// new code start
if ( !AllowedTags.Contains(_currentnode.Name) )
{
close = true;
}
// new code end
где AllowedTags - список всех известных тегов: b, p, br, span, div и т. Д.
вывод не на 100%, что вы хотите, но, может быть, достаточно близко?
<strong>Elem_A</strong>String_A1_2 String_A1_2
<strong>Elem_B</strong>String_B1_2 String_B1_2
<strong>Elem_A</strong>String_A2_2 <ignorestring_a2_2></ignorestring_a2_2> asdas
<strong>Elem_B</strong>String_B2_2 String_B2_2