2015-12-16 41 views
1

我想用C#解析HTML数据。如何确定哪个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可能是一个选项。但是,我仍然没有理解如何使用它来区分代码和非代码?

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

编辑3:我已经包括“attr1”作为辅助String.Replace。我需要找到要替换的属性和属性值。我需要能够区分代码和非代码。

有什么建议吗?

+1

Obligatory [HtmlAgilityPack](http://stackoverflow.com/questions/846994/how-to-use-html-agility-pack)链接。可能要至少检查一下。 –

+0

你可以做一个子字符串,但它会非常复杂。 – Ophitect

+0

是的,使用HtmlAgilityPack,它被设计用于解析HTML,它甚至擅长解析形成错误的html。 –

回答

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> 

这应该符合当前的要求。

相关问题