我想用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。我需要找到要替换的属性的属性和值。我需要能够区分代码和非代码。
有什么建议吗?
答案 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>
这应该符合当前的要求。