私は現在、約 1 年ほど前に仕事のために書いた Web アプリケーションを保守しています。基本的に、ユーザーはカスタム XHTML レポート テンプレートを作成できます。XmlDocument
、、などを使用しますXPathNavigator
。アル。プレースホルダーをデータで検証、サニタイズ、および置換します。
ほとんどの場合は問題なく動作しますが、プレースホルダー要素を実際にデータに置き換えているのではなく、プレースホルダーのテキストをデータ テキストに置き換えていることに気付きました。
考案された例:
<span class="my-placeholder">{CompanyName}</span>
なるだろう...
<span class="my-placeholder">Castopulence</span>
テンプレートは 1 回しか処理されなかったため、これは以前は実際には問題ではありませんでした。ユーザーが選択したデータのセットに対して実行することを選択したとき。ただし、現在は、結果の出力をプレビューして、印刷する前に変更するオプションを提供しています。この結果、置換エンジンによって複数回処理されます。最初に元の出力を生成し、変更された出力が「印刷」されるときに再度処理されます。置換エンジンは、実際にはデータであるプレースホルダーを見つけ、置換する対応するデータ要素を見つけることができず、プロセスは例外で失敗します。
元のコードでは、XPathNavigator.InnerXml
プロパティを使用して、プレースホルダー要素の内容を "{CompanyName}" から "Castopulence" に変更しました (例):
placeholder.InnerXml = this.Server.HtmlEncode(value);
したがって、このプレースホルダー要素を完全に置き換えたい場合は、代わりに次を使用するのが合理的ですXPathNavigator.OuterXml
。
placeholder.OuterXml = this.Server.HtmlEncode(value);
これはほとんどの場合に機能するように見えますが、少なくとも私は機能すると思いますが、一見ランダムな置換により、常にSystem.InvalidOperationException
「操作の結果としてコンテンツが生成されません」というメッセージがスローされます。そのため、それらのいずれかが機能しているとは確信していませんが、以前の置換に対して例外がスローされていないため、機能していると思います。
これが何を意味するのかよくわかりません。Google には、例外メッセージの正確なフレーズの結果が 4 つしかありません。それぞれ、私が話せない言語で書かれています。それらをGoogleで翻訳すると、関連するものは何も明らかになりませんでした。
実験的に試してみXPathNavigator.ReplaceSelf
ましたが、同じことを達成しているようですが、残念ながら同じ内部呼び出しから同じ例外がスローされます。
どちらの場合もスタック トレース:
System.Xml.DocumentXmlWriter.Close (WriteState currentState)
で System.Xml.XmlWellFormedWriter.Close()
で System.Xml.XPath.XPathNavigator.ReplaceSelf (XmlReader newNode)
で System.Xml.XPath.XPathNavigator.ReplaceSelf (文字列 newNode) で
...プライベート アプリケーションのシンボルを切り取った...
スローされる例外については、MSDN リファレンスでReplaceSelf
説明されていますが、スローされる唯一のSystem.InvalidOperationException
例外は、「XPathNavigator が要素、テキスト、処理命令、またはコメント ノードに配置されていない」場合です。Visual Studio デバッガーから、要素に配置されていることを確認できます。私のコードは同意します。XPathNavigator
プレースホルダーを指している は、実際には のクローンです(System.Xml.XPath.XPathNodeIterator.Current
これらはすべてリストに追加され、配列に変換され、置換フェーズで反復処理されます)。
何が問題なのか (例外は実際には何を意味するのか)、どうすれば修正できますか?
追加:実際に例外をスローしているクラス ( System.Xml.DocumentXmlWriter
) は、MSDN で文書化されていないようです (少なくとも、Google 検索でも MSDN 検索でも見つかりませんでした)。
追加:問題を引き起こしている 1 つの置換のデータは、単一のスペース (つまり、" "
) であると判断しました。なぜこれが の問題になるのかはわかりませんがXPathNavigator
、どうやらそれは... 空の文字列 (つまり、""
) も同様のようです。おそらく問題は、要素を空白だけに置き換えようとすることです。なぜそれが問題になるのかわかりません。