1

次のような行を持つXMLのようなファイルがあります。

<siteMapNode title="Our Clients" url="~/OurClients">
    <siteMapNode title="Website Portfolio" url="~/OurClients/Portfolio" />
    <siteMapNode title="Testimonials" url="~/OurClients/Testimonials" />
</siteMapNode>

<siteMapNode title="Contact" url="~/Contact" />
<siteMapNode title="" url="~/Pharmacy" />
<siteMapNode url="~/ClinicWebsiteDevelopment" />
<siteMapNode url="~/HospitalWebsiteDevelopment" />

ほとんどの行にタイトル属性があることに注意してください。私がやりたいのは、RegExを使用して、title属性を持たないすべての要素をキャプチャし、空のtitle属性を持つすべての行をキャプチャすることですtitle=""。したがって、ここでRegExを使用して例を実行すると、最後の3行が返されるはずです。これは、最後の2行にはタイトル属性がなく、その前の行には空のタイトル属性があるためです。

誰かがこの正規表現の作成を手伝ってくれませんか?ちなみにこれは.NET用です。

ありがとう

4

4 に答える 4

0

偽のルート要素を追加する場合は、Linq2XMLを使用してこれを簡単に行うことができます(存在しないと仮定)。

string foo = @"<bogus><siteMapNode title='Our Clients' url='~/OurClients'>
                <siteMapNode title='Website Portfolio' url='~/OurClients/Portfolio' />
                <siteMapNode title='Testimonials' url='~/OurClients/Testimonials' />
                </siteMapNode>

            <siteMapNode title='Contact' url='~/Contact' />
            <siteMapNode title='' url='~/Pharmacy' />
            <siteMapNode url='~/ClinicWebsiteDevelopment' />
            <siteMapNode url='~/HospitalWebsiteDevelopment' /></bogus>";


XDocument doc = XDocument.Parse(foo);

var elements = doc.Root.Elements("siteMapNode");
foreach (var elem in elements) {
    if (elem.Attribute("title") == null)
        Console.WriteLine("This one doesn't have the attribute!");
}

正規表現を使用する必要はありません。マークアップの解析にRegexenを使用しないでください。ドキュメントが有効なXMLでない形式であっても、フラグメントを抽出できる限り、ドキュメントを解析できます。正直なところ、これはそれを実行するためのより良い/より速い/より簡単な方法だと思います。

于 2012-08-17T22:46:39.147 に答える
0

一般に、文字列のない行に一致する正規表現を作成することはできません。代わりに、必要なものに一致する正規表現を記述し、行をループして正規表現に対してテストし、テストが失敗した場合は結果リストに行を追加します。したがって、次のようになります(これは疑似コードであり、実際のC#ではありません)。

while (line = nextline())
  if (re_match(/title=""/, line) || !re_match(/title=/, line)) 
    add_line_to_results(line);
于 2012-08-17T22:48:59.033 に答える
0

どうですか

(?m-s)^\s*<siteMapNode (?!.*title="[^"]).*?>

(?m-s)=行ごとに処理

^\s* =開始時にオプションの空白に一致

<siteMapNode=一致タグ

(?!.*title="[^"])=キャプチャしないテスト条件はtitle="と一致できません([^"]は空のタイトルケースに対応します

.*?>=タグの終わりに一致

于 2012-08-17T22:57:06.323 に答える
0

ここでlinqtoxmlを使用して説明 http://www.codeproject.com/Articles/24376/LINQ-to-XML

于 2012-08-17T22:37:39.537 に答える