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 に答える
1

HTML が整形式の XML (一見すると次のように見える) の場合、cdata ノードのテキストを新しい XML ドキュメントにロードし、XML を適切に変更してから、元の cdata ノードのテキストを XML に置き換えることができます。変更されたドキュメントのテキスト。

cdata は定義上、元の XML ドキュメントでは解析されないため、2 つ目の XML ドキュメントが必要になります。

于 2012-04-09T17:58:40.970 に答える
0

注: XML 文字列全体に対してこの正規表現を実行することはお勧めしません。次の正規表現は、適切なトラバーサル中にドキュメントの個々のノードで実行でき、実行する必要があります。ソリューションは、ユーザーが要求したものであり、正規表現ステートメントを特定の状況に適応させるのに問題があったため、xmlString 全体の単一の正規表現置換として投稿されました。それをできるだけ近づけます。


hrefURL が で始まるすべてのタグを削除する/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 に答える