如何使用HtmlAgilityPack使用span标记包装文本

时间:2016-02-09 13:42:07

标签: c# html-agility-pack

我目前正在使用HtmlAgilityPack从所有不必要的Tag中删除div的内容(包含contentEditable),因此我只能将文本保留在<p></p>标记之间。在收到文本后,我将它发送给一个校正器,该校正器在这个特定的<p></p>内给出了错误的单词。

Dictionary<string, List<string>> DicoError = new Dictionary<string, List<string>>();
int nbError = 0;
HtmlDocument html = new HtmlDocument();
html.LoadHtml(texteAFormater);

var nodesSpan = html.DocumentNode.SelectNodes("//span");
var nodesA = html.DocumentNode.SelectNodes("//div");

if (nodesSpan != null)
{
    foreach (var node in nodesSpan)
    {
        node.Remove();
    }
}
if (nodesA != null)
{
    foreach (var node in nodesA)
    {
        if (node.Attributes["edth_type"] != null)
        {
             if (string.Equals(node.Attributes["edth_type"].Value, "contenu", StringComparison.InvariantCultureIgnoreCase)==false)
             {
                   node.Remove();
             }
         }
    }
}
var paragraphe = html.DocumentNode.SelectNodes("p");
for(int i =0; i< paragraphe.Count; i++){
    string texteToCorrect = paragraphe[i].innerText;
    List<string> errorInsideParagraph = new List<string>();
    errorInsideParagraph = callProlexis(HtmlEntity.DeEntitize(texteToCorrect), nbError, DicoError);
    for(int j=0;j<motEnErreur.Count; j++){
        HtmlNode spanNode = html.CreateElement("span");
        spanNode.Attributes.Add("class", typeError);
        spanNode.Attributes.Add("id", nbError);
        spanNode.Attributes.Add("oncontextmenu","rightClickMustWork(event, this);return false");
    }
}

我设法将innerText发送给我的校正器,我得到的担心是承认我的内部文本为这段:

<p>this is some text <em>error</em> how should this work</p>

在这两个单词出错:errorshould

如何添加spanNode,以便<em></em>保持在error左右? (如果已经存在,那么我需要保留错误单词周围的实际标记,并将spanNode包裹在其周围。)

所以预期结果将是:

<p>this is some text <span ...><em>error</em></span> how <span ...>should</span> this work</p>

编辑:我正在考虑在innerHtml中找到错误的单词,然后获取该单词的父节点,如果它是<p>那么他周围没有标记我们可以添加{{ 1}}如果它是另一个标记,那么我们需要添加spanNode,因为spanNode的父节点是spanNode的子节点,但是该单词周围的标记的父节点。我不知道该怎么做。

0 个答案:

没有答案