在Windows Phone中使用HtmlAgilityPack添加指向圖像的鏈接

c# html-agility-pack windows-phone-7

我想為HTML中的每個圖像添加一個鏈接,其中“href”屬性的值是圖像的“src”屬性。即改變了

 "<p> <img src="test.jpg"/></p>"

<p><a href="test.jpg"><img src="jpg"/></a></p>

我的代碼來了:

using HtmlAgilityPack;
var imgs = document.DocumentNode.Descendants("img");
foreach (HtmlNode node in imgs)
{
    if (node.ParentNode.Name != "a")
    {
        string replaceStr = string.Format("<a href=\"{0}\">{1}</a>", node.GetAttributeValue("src", null), node.OuterHtml);
        //node.OuterHtml= replaceStr;   It doesn't work, the outerHtml is readonly
        //node.ParentNode.RemoveChild(node, true);
    }
}

那麼我應該如何修改我的代碼以使其工作?

更新:更新我的代碼後:

var imgs = document.DocumentNode.Descendants("img");
            foreach (var node in imgs)
            {
                if (node.ParentNode.Name != "a")
                {
                    var a = document.CreateElement("a");
                    a.SetAttributeValue("href", node.GetAttributeValue("src", null));
                    a.ChildNodes.Add(node);
                    node.ParentNode.ReplaceChild(a, node);
                }
            }

錯誤顯示“未處理的InvalidOperationException”。

在此處輸入圖像描述

一般承認的答案

首先,您可以使用xpath選擇父節點不是<a> <img>節點:

var imgs = doc.DocumentNode.SelectNodes("//img[not(parent::a)]").ToList();

然後你應該迭代這些節點。在每個迭代步驟中,只需為它創建一個新的''元素,附加迭代'',然後用新創建的<a>替換'':

foreach (var img in imgs)
{
    var a = doc.CreateElement("a");
    a.SetAttributeValue("href", img.GetAttributeValue("src", null));
    a.ChildNodes.Add(img);
    img.ParentNode.ReplaceChild(a, img);
} 

熱門答案

試試:

string replaceStr = string.Format("<a href=\"{0}\">{1}</a>", node.GetAttributeValue("src", null), node.OuterHtml);
var newNode = HtmlNode.CreateNode(replaceStr);
node.ParentNode.ReplaceChild(newNode.ParentNode, node);

並改變

foreach (var node in imgs)

通過

foreach (var node in imgs.ToList())

HtmlAgilityPack替換節點




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因