在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合法吗? 是的,了解原因