2016-04-22 12 views
0

可能な限り汎用コードを移植するために、XPathクエリービルダーを作成しようとしています。C#XML - XPathクエリービルダー - 動的にクエリーを作成する

これまでのところ、これは私が思い付いたものです:

private static string XpathQueryBuilder (string NodeName,string AttributeName = null, string AttributeValue = null) 
    { 

     string XpathAttr = ""; 

     if (AttributeName != null) 
      if (AttributeValue != null) 
       XpathAttr = "[@" + AttributeName + "='" + AttributeValue + "']"; 
      else 
       XpathAttr = "[@" + AttributeName + "='*']"; 
     return "//" + NodeName + XpathAttr; 

    }  

私はこの方法で参照の問題はしかし、この、場合、私は私が探したい複数の属性またはノードを持っているということです機能は動作しません。任意の数の属性および/またはノードを理論的に受け入れることができるXPathクエリを動的に作成する方法はありますか?

複数の属性と属性値を受け入れる関数を使用することが優先されます。これは、複数のノードよりも可能性が高いためです。

ありがとうございました!

+0

KeyValuePair を渡さずに、リストを渡して属性を追加してループさせてみましょう。 – james31rock

+0

これは、おめでとうLinqプロバイダを作成する代わりに良い簡単な選択肢になります。私は鍵ペアのメカニズムを知らなかった。ありがとうございました。 –

答えて

2

private static string XpathQueryBuilder(string nodeName, Dictionary<string,string> attributes = null) 
{ 
    string xpathAttr = ""; 
    if (attributes != null) 
    { 
     xpathAttr = 
      "[" + 
      String.Join(" and ", 
        attributes.Select(o => 
        { 
         var attrVal = o.Value ?? "*"; 
         return "@" + o.Key + "='" + attrVal + "'"; 
        }) 
      ) + "]"; 
    } 

    return "//" + nodeName + xpathAttr; 
} 

使用例:

var node = "Root"; 
var attrs = new Dictionary<string, string> 
{ 
    {"foo", "bar"}, 
    {"baz", null}, 
}; 
var result = XpathQueryBuilder(node, attrs); 
Console.WriteLine(result); 

dotnetfiddle demo

出力:

//Root[@foo='bar' and @baz='*'] 
+0

私が必要としていることについてはすごくうまく動作します。ありがとうございます。 –

1

LINQ to XMLを使ってみましたか?

using System.Linq; 
using System.Xml; 
using System.Xml.Linq; 

String GUID = "something"; 

XElement profilesXel = XElement.Load("your xml file path"); 
XElement currProfile = (from el in profilesXel 
         where (String)el.Element("GUID") == GUID 
         select el).First(); 

....

+0

あなたはあなたの答えでより具体的になりますか?私はこれを理解しようとするのに苦労しています。正直言っておかなければなりません。Linqライブラリでどこから始めるべきかわかりません。 –

+0

私は自分の答えを更新しました。これが役に立ったらいいですか? –

+0

ありがとうございました。 –

1

あなたはLINQ to XMLを使用することができます。

任意のデータを選択できます。

さらに汎用ソリューションが必要な場合は、your own LINQ Providerを実装してみてください。

2番目の方法は最初の方法より複雑ですが、その結果、LINQチェーンと式(ラムダなど)でxmlファイルにアクセスできるより汎用的なソリューションが得られます。

助けのための例でいくつかのリンク:あなたは複数の属性パラメータを受信する機能を可能にするためにDictionary<string,string>を使用することができます

http://weblogs.asp.net/mehfuzh/writing-custom-linq-provider

http://fairwaytech.com/2013/03/writing-a-custom-linq-provider-with-re-linq/

http://jacopretorius.net/2010/01/implementing-a-custom-linq-provider.html

https://aashishkoirala.wordpress.com/2014/03/10/linq-provider-1/

+0

リンクをありがとう、私は間違いなくXMLライブラリにLINQを見ていますが、今のところ、私は私が管理することができると感じるものを少し感じているので、私は辞書の方法に行くでしょう。 –

+0

確かに、私はあなたが今すぐに入ることを余儀なくされていません。 LINQ to XMLを控えめにお手伝いしてうれしいです。または、あなた自身のプロバイダを実装することを決めた場合は、お気軽にお問い合わせください! – MaKCbIMKo

関連する問題