2

xmlのようなテキストがあり、特定のパターンの最初の出現で発生するアイテムを検索したいと思います。通常は次のとおりです。

...
<PropertyGroup><name>true</name></PropertyGroup><PropertyGroup>....
....

またである可能性があります

...
<PropertyGroup>
<name>
true</name>
</PropertyGroup>
...
<PropertyGroup>
...

上記では、「名前」を抽出する必要があります。

私の最初の仮定は、すべての出現が1行にあることであり、文字列プロパティを使用してコードを記述しましたが、あらゆる可能性を考慮することは非常に困難であり、RegExだけが私を救うことができます。

書き方がわからない…

私はこのようなものから始めました:

Regex regex = new Regex("(?<=<PropertyGroup>#)<+");
Match matches = regex.Matches(Text)[0];
MessageBox.Show(matches.ToString());

これは、の後に最初のアイテムを見つけると思いますが<PropertyGroup>、角かっこ内にアイテムを入れる方法がわかりません...(1つ以上の改行やスペースの後にある可能性があります)。

xmlを解析するためのユーティリティがあることは知っていますが、ac#プログラムに挿入するのが簡単なものを探しています

誰かが私を助けてくれますか?どうもありがとうございます。

編集:実際のファイルの内容(私が今テストしているもので、奇妙なスペースはありません):

<?xml version="1.0" ?><Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets">
    <Import xxx/>   
  </ImportGroup>
  <PropertyGroup><myProp>true</myProp></PropertyGroup><PropertyGroup Label="UserMacros"/>
  <PropertyGroup/>
<!--maybe other stuff -->  
</Project>
4

3 に答える 3

2

LINQ to XMLの使用は非常に簡単で、正規表現を使用するよりもはるかに信頼性があります。

using System.Xml.Linq;

..。

XElement xmlTree = XElement.Load(fileName);
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";

List<XElement> properties = (
    from propertyGroup in xmlTree.Descendants(ns + "PropertyGroup")
    from property in propertyGroup.Elements()
    select property
).ToList();

これで、すべての要素の直接の子のすべてpropertiesのオブジェクトが含まれるはずです。名前と値の両方を次のように取得できます。XElementPropertyGroup

foreach(var property in properties)
{
    string name = property.Name.LocalName;
    string value = property.Value;
    // process both strings   
}

このように、空白の種類を気にする必要はなく、XMLから他の情報を取得するための、非常に保守可能で拡張可能なソリューションです。

さらに、それは本当に一般的に読む価値のあるものであり、ここから始めることができます。XMLファイルを処理する必要があるのはこれが最後ではありません。解析する正規表現を常に把握する必要がない場合は喜ばれます(繰り返しますが、一般的には不可能です)。

于 2012-11-11T23:08:47.007 に答える
1

これを試して:

(?s)<PropertyGroup>\s+<([^>]+)

例:

var result = 
    Regex.Match(input, @"(?s)<PropertyGroup>\s+<([^>]+)")
    .Groups[1].Value;
于 2012-11-11T22:42:33.637 に答える
1

「xmlを解析するためのユーティリティがあることを知っています」いいえ、.netフレームワークに直接組み込まれたクラスほど多くのユーティリティはありません。

で読むことをお勧めしますXmlDocument

于 2012-11-11T22:58:22.890 に答える