1

XML のメッセージ ログを作成する前に、メモリ内の xml ドキュメントから特定の値を置き換えようとしました。

なんとか置換できましたが、正規表現の置換メソッドは他のアイテムも置換しているようです。

私はこれを私が望んでいたよりも少しファンキーにする必要がありましたが、ドキュメント内の要素には異なる XML 名前空間を含めることができます...

string pattern = "(<).*?(ElementName>).*?(<\\/).*?(ElementName>).*?";

string replacementPattern = "(<).*?(ReplacedElementName>)xxxxxxxxxxxxxx(<\\/).*?(ReplacedElementName>).*?";

string messageToLog = Regex.Replace(messageToSanitise, pattern, replacementPattern);

誰かが私が間違っているところを指摘できますか?

[更新 16:11 BST 09/08/2013]

ありがとうダッシュ、私はそれをやろうとしましたが、オブジェクトにはxmlが含まれており、実際にはxmlドキュメント自体ではなく、オブジェクトにいくつかのヘッダーがあり、xmlがドキュメントエンベロープ内にあるように見えます。理想的には、ログに記録する前に情報 (ヘッダーを含む) を失いたくありません。変更しようとしている要素は常に 1 つまたは 2 つ出現し、それ以上でも 1 以下でもありません。

4

1 に答える 1

2

xml が stringmessageToSantiseにある場合、次のことを試すことができます。

XmlDocument の使用:

(古いバージョンのフレームワークで一般的な従来の XML 解析、および古いバージョンでの唯一の選択肢)

XmlDocument messageDoc = new XmlDocument();
messageDoc.Load(messageToSanitise);
messageDoc.SelectSingleNode(path_to_node).Value = replacementValue

path_to_node適切なXPath式で使用できます。

XmlDocument から xml 文字列を取得するには、messageDoc.OuterXmlプロパティを使用します。

string messageToLog = messageDoc.OuterXml;

XDocument の使用:

(フレームワークの新しいバージョンでサポートされている、LINQ スタイルのメカニズムによる xml 解析)

XDocument messageDocument = new XDocument();
messageDocument.Parse(messageToSanitise);
messageDocument.Element(path_to_element).value = replacementValue;

XDocument をナビゲートするために、プロパティも使用したい場合がありDescendentsます。ノードに到達する方法の例には、この回答MSDN ドキュメントが含まれます。

XDocument から Xml を取得するには、次を使用します。messageDocument.ToString();

string messageToLog = messageDocument.ToString();

これにより、置換対象を正確に指定できます。

XmlDocument と XDocument のどちらを使用するかを決定したい場合は、この質問への回答を読むことをお勧めします。

于 2013-08-09T13:39:15.937 に答える