3

我在 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

4 回答 4

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;
于 2012-04-09T18:28:30.160 回答
4

我会使用HtmlAgilityPack来完成这项任务。任务本身非常简单:使用 xpath 选择节点,然后删除它们。剩下的就是得到结果 HTML:

它是一个 .NET 代码库,允许您解析“网络之外”的 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();

于 2012-04-09T18:32:30.447 回答
1

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

由于根据定义,原始 XML 文档中没有解析 cdata,这就是为什么您需要第二个。

于 2012-04-09T17:58:40.970 回答
0

注意:我不建议在整个 XML 字符串上运行此 Regex - 因为大多数人都认为这是不好的。以下正则表达式可以并且应该在正确遍历期间在文档的各个节点上运行。该解决方案被发布为整个 xmlString 上的单个正则表达式替换,因为这是用户要求的,并且他们在将正则表达式语句调整到他们的特定情况时遇到了麻烦 - 我逐个字符地编写代码以匹配他们打算如何使用它尽可能地接近。


href要去除url 以 开头的所有标签,/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");
于 2012-04-09T17:54:16.483 回答