如何确定哪些HTML是"代码"哪个是"显示/内容"?

时间:2015-12-16 03:06:59

标签: c# html replace

我想用C#来解析HTML数据。

如果您认为HTML数据的每个字符都有点:true =" html / code"。 false ="显示/内容"。然后你会知道HTML的哪一部分是"代码"。

让我们使用以下HTML示例:

<a id="a1" class="c1" attr1="x" attr2="y">a1 c1 attr1</a> <p>a1 c1 attr1 attr2</p>

我想做一个C#String.Replace来查找&#34; a1&#34;的所有实例。并用&#34; new1&#34;替换它。 我想做一个C#String.Replace来查找&#34; attr1&#34;的所有实例。并用&#34; new2&#34;替换它。 但我只想要html&#34;代码&#34;受到影响,我想要所有&#34;内容&#34;不要改变。期望的结果是:

<a id="new1" class="c1" new2="x" attr2="y">a1 c1 attr1</a> <p>a1 c1 attr1 attr2</p>

注意:所需的结果有另外两个&#34; a1&#34;没有重命名的。 注意:所需的结果有2个其他的&#34; attr1&#34;没有重命名。

我无法找到任何可以帮助完成这项工作的现有库或软件。

EDIT1:HtmlAgilityPack可能是一个选项。但是,我仍然没有更接近理解如何使用它来区分代码和非代码?

EDIT2:请记住,这个问题尽可能地简化了我的真实问题。使用和不使用引号重命名的东西都不是答案。 我特别需要弄清楚如何区分代码和非代码。

EDIT3:我已经包含了&#34; attr1&#34;作为辅助String.Replace。我需要找到要替换的属性的属性和值。我需要能够区分代码和非代码。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

根据对此帖的评论,我想出了以下内容:

void Main()
{
    var html = "<a id=\"attr1\" class=\"c1\" attr1=\"x\" attr2=\"y\">a1 c1 attr1</a> <p>a1 c1 attr1 attr2</p>";

    var res = Replace(html, "attr1", "attrA");
}

public string Replace(string html, string oldval, string newval)
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(html);

    foreach (var n in doc.DocumentNode.ChildNodes)
    {
        foreach (var a in n.Attributes)
        {
            if (a.Value.Equals(oldval))
            {
                a.Value = newval;
            }

            if (a.Name.Equals(oldval))
            {
                a.Name = newval;
            }
        }
    }

    return doc.DocumentNode.OuterHtml;
}

鉴于输入:

<a id="attr1" class="c1" attr1="x" attr2="y">a1 c1 attr1</a> <p>a1 c1 attr1 attr2</p>

输出结果为:

<a id="attrA" class="c1" attra="x" attr2="y">a1 c1 attr1</a> <p>a1 c1 attr1 attr2</p>

这应该符合当前的要求。