2011-01-10 17 views
0

与えられた文字列を含む1つ以上の属性を持つすべてのルールノードを取得します。私はそれらを見つけたら、私は新しいものと文字列を交換する必要があります。 私はそれらのXPathクエリをテストしたが、彼らは動作しません:属性に指定された文字列が含まれるすべてのノードを取得します。

string xpathquery = "/FIREWALL/ETH/RULE[contains(@*,'" + toTest + "')]"; //DOES NOT WORK 
string xpathquery = "/FIREWALL/ETH/RULE[contains(attribute::*,'" + toTest +"')]"; //DOES NOT WORK 

奇妙なことは、私は@attributenameまたは属性:: attributeNameのを使用している場合、それは実際に動作することです。エラーはどこですか?

私は2つの異なるケースがあるかもしれませんので、のは、私は$ HOST2で$ HOST1を交換したいとしましょう含まれている機能を使用しています:

<RULE .... host="$HOST1"/> //NO PROBLEM 
<RULE .... host="$HOST1:21"/> //I NEED TO REPLACE ONLY $HOST1, NOT THE ENTIRE STRING 

私はただのXmlNodeのValue属性を設定するが、私はできません文字列を変更する必要があります。実際には、XPathでこれをfindとreplaceなどで処理できるかどうかはわかりません。

+3

あなたは間違いなく* *このためのXPathを使用しますか?個人的に私はLINQをXMLに直接使用したいと思いますが、明らかにあなたの呼び出しです。 –

+0

LINQでより簡単な解決策があれば...私はそれを使ったことはありませんが、私は学ぶことができます。 SQLに似たクエリ言語のように見えますが、そうですか? – raz3r

答えて

0

使用しているクエリは、すべての属性の連結テキストをチェックします。正しい構文は次のとおりです。

string xpathquery = "/FIREWALL/ETH/RULE/@*[contains(.,'" + toTest + "')]/.."; 

つまり、一致する属性を見つけてその親要素を返します。もちろん、属性値を使用して作業したい場合は、最後に/..を省略することができます。実際の属性ノードが返され、それに応じて値を変更することができます。

+1

またはそれに相当する/ FILEWALL/ETH/RULE [@ * [(。、 '+ toTest + "])]」が含まれています。しかし、文字列連結によるXPath式の作成は悪い習慣です。なぜなら、それはあなたが注射の攻撃にさらされるからです。使用しているAPIが許可している場合は、変数を使用して呼び出し元のAPIから変数をバインドする方がよいでしょう。 –

+0

あなたは次のように書いています:*使用しているクエリは、すべての属性の連結テキストをチェックします。** **間違っています**。そして問題は実際には反対です。 –

0

標準XPath関数は、最初の引数として単一の文字列を必要とします。最初の引数が(あなたの場合のように)ノードのリストである場合、提供されたノードセットの最初のノードの文字列値だけが使用されます。これは現在の結果を得る方法です。

ソリューション

/FIREWALL/ETH/RULE/@*[contains(.,' + toTest + ')] 
+0

+1正解:ノードセットの暗黙のキャスト –

関連する問題