2010-12-02 10 views
1

パラメータを使用してxパスを作成するベストプラクティスは何ですか? valueRequiredが今まで'ような厄介な価値を持っているとしているかどうかに依存Xml:パラメータ付きのxパスを作成するベストプラクティス

XmlNode node = parentNode.SelectSingleNode(
    string.Format("./field1/field2[@attributeName='{0}']", valueRequired)); 
+0

この種のコードで問題になるのは、XPATH構文を破らないように、valueRequiredを適切にエスケープする必要があることです。私はXPATHの深いファンですが、Marc Gravellの提案にはこの問題はありません:) –

+0

SQLクエリはパラメータ化されていますが、パラメータ化されたXPathはまだありません... –

答えて

0

XPathエンジンのホストは、コンテキストの一部である変数を作成することができます。この機能を提供するホストの例は、XSLTです。

XSLTでは一つは単純に記述します。

field1/field2[@attributeName=$valueRequired]" 

を.NETでXPath変数と関数を作成する1つの方法は、XsltContextクラスとそのメソッドResolveVariable()ResolveFunction()

を使用することです覚えておくべきもう一つのこと:XPath式の "スケルトン"にユーザーの入力を盲目的に挿入しないでください。 XPath injectionの可能性に注意してください。

+0

+1可変バインディングの推奨で​​す。私はクラスを探していたが、見つけられなかった。 –

2

私は属性が正確な値、のようなものを持っているところxmlノードを選択する必要があります。しかし、うまくいくはずの簡単な値のために。

そうでない場合は、LINQツーXMLはかなりいいです。

// where parentNode is XElement 
var node = (from el in parentNode.Elements("field1").Elements("field2") 
      where (string) el.Attribute("attributeName") == valueRequired 
      select el).FirstOrDefault(); 

(必要に応じて他のタイプの(string)を置き換える)

ここでのXmlElement上でLINQを使用して似たようなのです:

var parentNode = node.SelectNodes("./field1/field2[@attributeName]") 
     .Cast<XmlElement>() 
     .Where(el => el.GetAttribute("attributeName") == valueRequired) 
     .FirstOrDefault(); 

他のオプション(なし、いずれも LINQ)は、foreachを使用して手動でループしています。

+0

古いXmlDocumentコードでこれを行うことは可能ですか、それをXDocument/XElementに書き直すことをお勧めしますか? –

+0

@Andrew - XmlDocumentと同様のものを表示するように編集します –

+1

「xパスとパラメータを作成するベストプラクティス」への答えは... LINQを使用していますか? –

1

X-Path表記は、LINQよりも短く、より明確です。この場合、LINQではなくX-Pathを使用することをお勧めします。あなたのケースでは、既に属性タイプを知っているので、引用符を含めるかどうかを簡単に判断する必要があります。

次の方法を通じて、System.Xml.XPathの要素を使用することを検討する必要があります。

XmlReader xmlReader = XmlReader.Create(xmlFile); 
XElement xmlRoot = XElement.Load(xmlReader); 
xmlReader.Close(); 
IEnumerable<XElement> nodes = 
    xmlRoot.XPathSelectElements(string.Format("./field1/field2[@attributeName='{0}']", valueRequired)); 
+0

これは不要です**元の質問の例より複雑**ですか?ああ、 'XPathSelectElements'への引数はボルケージされます(コンパイルされません)。 –

+0

@Marc Gravell:ありがとう私は二重引用符を削除しました。 – ArBR

1

あなたのアプローチは結構です。 valueRequiredには何があるのか​​を知っておくべきです。そのソースを信頼していない場合は、信頼できないデータの場合と同様にそのデータをサニタイズします。

また、あなただけの使用、./で相対パスを開始する必要はありません。

field1/field2[@attributeName='{0}'] 
関連する問題