5

このようなパスのような文字列を解析する標準的な方法はありますか?

Server[@Name='MyServerName']/Database[@Name='MyDatabaseName']/Table[@Name='MyTableName' and @Schema='MySchemaName']

結果は次のようになります。

  • アイテム名 (サーバー)
    • PropertyName (名前)、PropertyValue (MyServerName)
  • アイテム名 (データベース)
    • PropertyName (名前)、PropertyValue (MyDatabaseName)
  • アイテム名 (テーブル)
    • PropertyName (名前)、PropertyValue (MyTableName)
    • PropertyName (スキーマ)、PropertyValue (MySchemaName)

ここで最も明白なのは、正規表現を作成することです (そして、もちろん、String.Split) ですが、より良い標準的な方法があるのでしょうか?

参考までに、文字列は SMO のUrn.Value.

アップデート。

答えは見つかりました。以下を参照してください。

4

4 に答える 4

5

まあ、やった。:)

答えはとても簡単です。Urn.XPathExpressionプロパティがあります。ただし、戻り値の型はMicrosoft.SqlServer.Management.Sdk.Sfc.XPathExpressionであり、System.Xml.XPath.XPathExpressionではありません(これは私を混乱させました)。

そしてXPathExpression、SMOには、それ自体を解析するために必要なすべての機能があります。

        var urn = new Urn("Server[@Name='MyServerName']/Database[@Name='MyDatabaseName']/Table[@Name='MyTableName' and @Schema='MySchemaName']");

        for (var i = 0; i < urn.XPathExpression.Length; i++)
        {
            Console.WriteLine("ItemName ({0})", urn.XPathExpression[i].Name);

            foreach (DictionaryEntry item in urn.XPathExpression[i].FixedProperties)
            {
                Console.WriteLine("\tPropertyName ({0}), PropertyValue ({1})", item.Key, item.Value);
            }
        }

この出力を生成します:

ItemName (Server)
        PropertyName (Name), PropertyValue ('MyServerName')
ItemName (Database)
        PropertyName (Name), PropertyValue ('MyDatabaseName')
ItemName (Table)
        PropertyName (Name), PropertyValue ('MyTableName')
        PropertyName (Schema), PropertyValue ('MySchemaName')

Christian.K、XPathについてのヒントをありがとう!

于 2012-08-21T07:50:51.923 に答える
1

少し遅いかもしれませんが、同じ答えを探していたので、自分でこれを見つけました。Urn にはいくつかの Get 関数があります。

 var urn = new Urn("Server[@Name='MyServerName']/Database[@Name='MyDatabaseName']/Table[@Name='MyTableName' and @Schema='MySchemaName']");
    Console.WriteLine(urn.GetNameForType("Table"));

「MyTableName」になります

于 2013-03-20T14:43:08.730 に答える
0

唯一の標準的な方法は、パターン マッチングで正規表現を使用することだと思います。

次のコード スニペットが役立ちます -

    string input = @"Server[@Name='MyServerName']/Database[@Name='MyDatabaseName']/Table[@Name='MyTableName' and @Schema='MySchemaName']";
    string elementPattern = @"(?<ItemName>\w+)\[@(?<PropertyName>\w+)='(?<PropertyValue>\w+)'( and @(?<PropertyName>\w+)='(?<PropertyValue>\w+)')*\]";

    Regex elementRegex = new Regex(elementPattern, RegexOptions.Compiled);

    string[] elements = input.Split('/');

    foreach (string element in elements)
    {
        Match m = elementRegex.Match(element);

        if (m.Success)
        {
            Console.WriteLine("ItemName ({0})", m.Groups["ItemName"]);

            foreach (Capture capture in m.Groups["PropertyName"].Captures)
            {
                Console.WriteLine("PropertyName ({0})", capture.Value);
            }

            foreach (Capture capture in m.Groups["PropertyValue"].Captures)
            {
                Console.WriteLine("PropertyValue ({0})", capture.Value);
            }
        }
    }

    Console.ReadKey();

出力: -

ItemName (Server)
PropertyName (Name)
PropertyValue (MyServerName)
ItemName (Database)
PropertyName (Name)
PropertyValue (MyDatabaseName)
ItemName (Table)
PropertyName (Name)
PropertyName (Schema)
PropertyValue (MyTableName)
PropertyValue (MySchemaName)

注:必要に応じて変更してください。

于 2012-08-21T07:39:48.363 に答える
0

テストするコードアプリはありませんが、次のようなものです

var resultArr=str.Split(new char[]{'/', '[',']','@', '='});必要なアーティファクトの配列を作成する必要があります。

残っている唯一のことは、それぞれの正しい配列インデックスを特定することです。

于 2012-08-21T06:57:25.553 に答える