如何从CDATA中删除href标记

时间:2012-04-09 17:44:50

标签: c# xml xmldocument

我在xml文档中有以下CDATA:

<![CDATA[ <p xmlns="">Refer to the below: <br/>
</p>
<table xmlns:abc="http://google.com pic.xsd" cellspacing="1" class="c" type="custom" width="100%">
    <tbody>
        <tr xmlns="">            
            <th style="text-align: left">Basic offers...</th>
        </tr>
        <tr xmlns="">
            <td style="text-align: left">Faster network</td>
            <td style="text-align: left">
            <ul>                
                <li>Session</li>
            </ul>
            </td>
        </tr>
        <tr xmlns="">
            <td style="text-align: left">capabilities</td>
            <td style="text-align: left">
            <ul>                
                <li>Navigation,</li>
                <li>message, and</li>
                <li>contacts</li>
            </ul>
            </td>
        </tr>
        <tr xmlns="">
            <td style="text-align: left">Data</td>
            <td style="text-align: left">
            <p>Here visit google for more info <a href="http://www.google.com" target="_blank"><font color="#0033cc">www.google.com</font></a>.</p>
            <p>Remove this href tag <a href="/abc/def/{T}/t/1" target="_blank">Information</a> remove the tag.</p>
            </td>
        </tr>
    </tbody>
</table>
<p xmlns=""><br/>
</p>
  ]]> 

我想知道如何扫描href =“/ abc / def并删除以abc / def开头的href标签。在上面的示例中,删除href标签并在标签内留下”信息“文本.CDATA可以有不止一个带有“abc / def ...”的href标签。 我在这个应用程序中使用C#。有人可以帮助我,告诉我如何做到这一点?我应该使用正则表达式还是有办法用xml本身来做?

这是我正在尝试的正则表达式:

"<a href=\"/abc/def/.*></a>"

我想保留a href标签的内部文本,只需删除标签即可。但上面的正则表达式不起作用。

4 个答案:

答案 0 :(得分:6)

使用HtmlAgilityPack

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);

var nodes = doc.DocumentNode
    .Descendants("a")
    .Where(n => n.Attributes.Any(a => a.Name == "href" && a.Value.StartsWith("/abc/def")))
    .ToArray();

foreach(var node in nodes)
{
    node.ParentNode.RemoveChild(node,true);
}

var newHtml = doc.DocumentNode.InnerHtml;

答案 1 :(得分:4)

我将HtmlAgilityPack用于此任务。任务本身很简单:使用xpath选择节点,然后删除它们。剩下的就是获得结果HTML:

  

它是一个.NET代码库,允许您解析“out of the web”   HTML文件。解析器非常宽容,“真实世界”格式错误   HTML。对象模型与System.Xml的提议非常相似,   但对于HTML文档(或流)。

var doc = new HtmlDocument();
doc.LoadHtml(xml);

var anchors = doc.DocumentNode.SelectNodes("//a[starts-with(@href, '/abc/def')]");
foreach (var anchor in anchors.ToList())
    anchor.Remove();

var result= doc.DocumentNode.OuterHtml;

这将为您提供您想要的。

修改

如果您只想删除href属性,请将此行anchor.Remove()更改为此anchor.Attributes["href"].Remove();

答案 2 :(得分:1)

如果HTML是格式良好的XML(一目了然),您可以将cdata节点的文本加载到新的XML文档中,根据需要修改XML,然后替换原始cdata节点的文本使用已修改文档的XML文本。

由于cdata根据定义未在原始XML文档中解析,因此您将需要辅助文件。

答案 3 :(得分:0)

注意:我不建议在整个XML字符串上运行此正则表达式 - 因为大多数人认为这很糟糕。在正确遍历期间,可以并且应该在文档的各个节点上运行以下正则表达式。该解决方案在整个xmlString上作为单个正则表达式替换发布,因为这是用户请求的并且他们在调整时遇到问题正则表达式声明对他们的特定情况 - 我逐个字符编写代码,以匹配他们打算尽可能密切地使用它。


要删除网址以href开头的所有/abc/def/代码,您最好使用正则表达式:

result = Regex.Replace(xmlString, @"<a href=\"/abc/def/.*>(.*)</a>", "$1");

跟进以下评论

根据MSDN

  

在指定的输入字符串中,将指定的正则表达式匹配的所有字符串替换为指定的替换字符串。

此替换将在所有实例上发生,而不仅仅是第一个。如果其余部分不起作用,那是因为它们与正则表达式不匹配。

例如,如果在某些情况下a和href之间有额外的空格,或者在href字段之前指定了目标字段,则需要使用某个不太具体的替换:

result = Regex.Replace(str, @"<a.*href=\"/OST/OSTdisplay/.*>(.*)</a>", "$1");