Удалите HTML-тег, но оставьте внутренний текст, используя HTML Agility? - PullRequest
2 голосов
/ 15 октября 2010

Я пытаюсь удалить некоторые теги HTML.У меня есть проект, где человек сохранил несколько поисков.Проблема в том, что ключевые слова были выделены.Например.

<p>Here is some <span class='highlite'>awesome</span> example.</p>

Ловкость Html превращает это в 3 узла.Текстовый узел, диапазон и текст снова.Я хотел бы создать один тег из этого.Чтобы это выглядело как

<p>Here is some awesome example.</p>

Я попытался получить все теги с подсветкой класса css, а затем

 //Stip all retarded hilite tags
 var hiliteTags = from tags in doc.DocumentNode.SelectNodes("//span[@class='hilite']")
                  select tags;

 foreach (var tag in hiliteTags)
 {
      tag.ParentNode.RemoveChild(tag, true);
 }

, но это привело к текстовому узлу, текстовому узлу, текстовому узлу.Я хотел один текстовый узел.Затем я попытался использовать

Node.InnerText += someVariable;

, но InnerText, несмотря на то, что документация говорит, что только для чтения.

Любые идеи о том, как это сделать?

Во-вторых, пока яспрашивая, есть ли способ избавиться от узлов, которые содержат только текст, и это \ r \ n.Я не заинтересован в этом вообще, и это только мешает и делает синтаксический анализ неудобным.Я хотел бы иметь возможность удалить их тоже.Например,

<tr>
    <td>Foo</td>
    <td>Bar</td>
</tr>

с использованием Html Agility становится

Node (tr)
Node (\r\n)
Node (td- Foo)
Node (\r\n)
Node (td - Bar)
Node (\r\n)
Node (tr)

Я пытаюсь выбрать эти узлы.Я пытался с Linq, и я пытался использовать XPath.Я просто не могу их удалить.

1 Ответ

0 голосов
/ 27 октября 2010

Что если вы просто возьмете InnerText тега p и создадите отдельное дерево документов для его сохранения.

var root = HtmlNode.CreateNode("<root></root>");
foreach (var node in doc.DocumentNode.SelectNodes("/p"))
{
    var newNode = HtmlNode.CreateNode(string.Format("<p>{0}</p>", node.InnerText));
    root.AppendChild(newNode);
}

Помогает ли это?

...