2012-04-04 2 views
0

Я хотел бы найти файл HTML для определенной строки, а затем извлечь теги. Дано:Получить теги вокруг текста в HTML-документе, используя C#

<div_outer><div_inner>Happy birthday<div><div>

Я хотел бы искать HTML для «С днем ​​рождения», то есть функция возвращает какую-то структуру тегов: это внутренний тег, это тег за пределами этого один и т.д. Итак, <div_inner></div>, затем <div_outer></div>.

Любые идеи? Я думаю, что HTMLAgilityPack, но я не смог понять, как это сделать.

Спасибо, как всегда, ребята.

+0

Что является источником этого HTML? – Oded

ответ

2

HAP - хорошее место для этого.

Вы можете использовать OuterHtml и Parent свойства Node, чтобы получить входящие в комплект элементы и разметку.

+0

Итак, вы говорите, итерации через каждый тег, пока я не найду текст, а затем вернусь назад? Хорошая идея, но это не слишком эффективно. Я думаю, иногда очевидный ответ выигрывает, ха-ха. –

+0

@MarkWilliams - Если у вас нет способа перейти к тексту (скажем, div с определенным значением атрибута), это единственный способ сделать это с помощью синтаксического анализатора. Вы можете получить индекс строки, а затем вернуться назад вперед в строке, чтобы найти окружающие элементы, но это будет означать написание собственных подпрограмм. – Oded

1

Вы можете использовать xpath для этого. Я использую //*[text()='Happy birthday'][1]/ancestor-or-self::* выражение, которое находит первый (для простоты) узла, текстовый контент является Happy birthday, а затем возвращает все предок (родитель, прародитель и т.п.) этот узел и сам узел:

var doc = new HtmlDocument(); 
doc.LoadHtml("<div_outer><div_inner>Happy birthday<div><div>"); 

var ancestors = doc.DocumentNode 
    .SelectNodes("//*[text()='Happy birthday'][1]/ancestor-or-self::*") 
    .Reverse() 
    .ToList(); 

Это кажется что порядок возвращаемых узлов - это порядок узлов, найденных в документе, поэтому я использовал метод Enumerable.Reverse для его изменения.

Это вернет 2 узла: div_inner и div_outer.

Смежные вопросы