パラメータを使用してxパスを作成するベストプラクティスは何ですか? valueRequired
が今まで'
ような厄介な価値を持っているとしているかどうかに依存Xml:パラメータ付きのxパスを作成するベストプラクティス
XmlNode node = parentNode.SelectSingleNode(
string.Format("./field1/field2[@attributeName='{0}']", valueRequired));
パラメータを使用してxパスを作成するベストプラクティスは何ですか? valueRequired
が今まで'
ような厄介な価値を持っているとしているかどうかに依存Xml:パラメータ付きのxパスを作成するベストプラクティス
XmlNode node = parentNode.SelectSingleNode(
string.Format("./field1/field2[@attributeName='{0}']", valueRequired));
XPathエンジンのホストは、コンテキストの一部である変数を作成することができます。この機能を提供するホストの例は、XSLTです。
XSLTでは一つは単純に記述します。
field1/field2[@attributeName=$valueRequired]"
を.NETでXPath変数と関数を作成する1つの方法は、XsltContext
クラスとそのメソッドResolveVariable()
とResolveFunction()
を使用することです覚えておくべきもう一つのこと:XPath式の "スケルトン"にユーザーの入力を盲目的に挿入しないでください。 XPath injectionの可能性に注意してください。
+1可変バインディングの推奨です。私はクラスを探していたが、見つけられなかった。 –
:
私は属性が正確な値、のようなものを持っているところ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を使用して手動でループしています。
古いXmlDocumentコードでこれを行うことは可能ですか、それをXDocument/XElementに書き直すことをお勧めしますか? –
@Andrew - XmlDocumentと同様のものを表示するように編集します –
「xパスとパラメータを作成するベストプラクティス」への答えは... LINQを使用していますか? –
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));
これは不要です**元の質問の例より複雑**ですか?ああ、 'XPathSelectElements'への引数はボルケージされます(コンパイルされません)。 –
@Marc Gravell:ありがとう私は二重引用符を削除しました。 – ArBR
あなたのアプローチは結構です。 valueRequired
には何があるのかを知っておくべきです。そのソースを信頼していない場合は、信頼できないデータの場合と同様にそのデータをサニタイズします。
また、あなただけの使用、./
で相対パスを開始する必要はありません。
field1/field2[@attributeName='{0}']
この種のコードで問題になるのは、XPATH構文を破らないように、valueRequiredを適切にエスケープする必要があることです。私はXPATHの深いファンですが、Marc Gravellの提案にはこの問題はありません:) –
SQLクエリはパラメータ化されていますが、パラメータ化されたXPathはまだありません... –