【问题标题】:How to determine which HTML is "code" and which is "display/content"?如何确定哪个 HTML 是“代码”,哪个是“显示/内容”?
【发布时间】:2016-03-22 01:46:22
【问题描述】:

我想使用 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 来查找“a1”的所有实例并将其替换为“new1”。 我想做一个 C# String.Replace 来查找“attr1”的所有实例并将其替换为“new2”。 但我只希望 html“代码”受到影响,并且我希望所有“内容”都不会被更改。期望的结果是:

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

注意:所需的结果有 2 个未重命名的“a1”的其他实例。 注意:所需的结果有 2 个其他未重命名的“attr1”实例。

我找不到任何有助于这项工作的现有库或软件。

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

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

EDIT3:我已将“attr1”作为辅助 String.Replace 包含在内。我需要找到要替换的属性和属性值。而且我需要能够区分代码和非代码。

有什么建议吗?

【问题讨论】:

  • 你可以做一个子串,但它会很复杂。
  • 是的,使用HtmlAgilityPack,它是为解析HTML而设计的,它甚至擅长解析格式错误的html。
  • 我在想 HtmlAgilityPack 可能是一个答案,我以前用过它。但是,我仍然无法理解如何使用它来区分代码和非代码?
  • 这不只是 attributes 与 HTML 元素的 innerText 的字符串替换吗?如果是这种情况,那么 HtmlAgilityPack + 替换属性数据就可以解决问题。
  • 我同意 Regex 不是一个选项。当您使用正则表达式解决 1 个问题时,您现在有 2 个问题。根据 EDIT3,您将如何解决这个问题?

标签: c# html replace


【解决方案1】:

根据这篇文章中的 cmets,我想出了以下内容:

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>

这应该符合当前的要求。

【讨论】:

    猜你喜欢
    • 2014-01-10
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多