C# 如何确定哪个HTML是;代码“;这就是;显示/内容“;?

C# 如何确定哪个HTML是;代码“;这就是;显示/内容“;?,c#,html,replace,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> a1 c1属性1a1 c1属性1属性2 我想做一个C#String.Repl

我想用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>
a1 c1属性1a1 c1属性1属性2

我想做一个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>
a1 c1属性1a1 c1属性1属性2

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

我找不到任何现有的库或软件可以帮助这项工作

EDIT1:HtmlAgilityPack可能是一个选项。然而,我仍然没有进一步理解如何使用它来区分代码和非代码

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

EDIT3:我已将“attr1”作为次要字符串包含。替换。我需要找到要替换的属性和属性值。我需要能够区分代码和非代码


有什么建议吗?

根据对这篇文章的评论,我提出了以下建议:

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;
}
void Main()
{
var html=“a1 c1 attr1a1 c1 attr1 attr2

”; var res=Replace(html,“attr1”、“attrA”); } 公共字符串替换(字符串html、字符串oldval、字符串newval) { HtmlAgilityPack.HtmlDocument doc=新的HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); foreach(doc.DocumentNode.ChildNodes中的变量n) { foreach(n.Attributes中的变量a) { 如果(a.Value.Equals(oldval)) { a、 值=newval; } 如果(a.Name.Equals(oldval)) { a、 Name=newval; } } } 返回doc.DocumentNode.OuterHtml; }
根据输入:

<a id="attr1" class="c1" attr1="x" attr2="y">a1 c1 attr1</a> <p>a1 c1 attr1 attr2</p>
a1 c1属性1a1 c1属性1属性2

输出为:

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


这应该满足当前的要求。

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