1

条件に基づいて子ノードを見つけてその値を置き換える必要があるコードを C# で書いています。

利用可能なもの:

  1. XML ノード
  2. placeholder = プレースホルダーを示す文字列
  3. replacementString = プレースホルダー文字列をこの文字列に置き換える必要があります

何を終わらせるべきなのですか :

  1. text = placeholder の xml ノードで子を検索するか、任意の属性 havingvalue = placeholder string を含むノードを検索します

  2. ノードの場合、内側のテキスト = replacementString を割り当てます。属性の場合、属性値を replacementString に置き換えます

これまでの進捗状況:

xpathを使用してテキストとしてプレースホルダーを持つノードを見つけることができます

descendant::*[text()='placeHolder']

しかし今、私はプレースホルダーが属性値としても存在できるルールの追加に固執しています。

制限:

SelectSingleNode で使用できる XPath で実行する必要があります。指定されたプレースホルダーを持つ唯一のノード/属性が存在できることが保証されています

別:

xmlnode の文字列を取得し、文字列の置換を実行し、DOM にロードしてドキュメント要素を取得できることはわかっています。しかし、文字列の置換のためだけにメモリ内に別の DOM を作成したくありません。

もうありがとう

4

1 に答える 1

0

与えられた

XmlNode foo;
string placeHolder, replacement;

あなたは使用できるはずです

XmlNode rep = foo.SelectSingleNode(string.Format("//@*[. = '{0}'] | //text()[. = '{0}']", placeHolder));
if (rep != null) {
  rep.InnerText = replacement;
}

両方ともXmlText設定XmlAttribute可能なInnerTextプロパティがあります。

[編集] ノードfooがより大きなドキュメントの一部である場合、XPath を次のように変更することをお勧めします。

XmlNode rep = foo.SelectSingleNode(string.Format(".//@*[. = '{0}'] | .//text()[. = '{0}']", placeHolder));
于 2013-04-22T12:10:41.293 に答える