XML ドキュメントがあり、シンタックス ハイライトを実行したいと考えています。
このコードでは、 XPathDocument、XPathNavigator、およびXPathNodeIteratorを使用しています。Select()を呼び出した後、XML ドキュメント内の元のテキストを取得するにはどうすればよいですか?
var xpathDoc = new XPathDocument(new StringReader(this.richTextBox1.Text));
var nav = xpathDoc.CreateNavigator();
XmlNamespaceManager xmlns = new XmlNamespaceManager(nav.NameTable);
xmlns.AddNamespace("ns1", "urn:myxnlnamespace");
XPathNodeIterator selection = nav.Select(xpathExpression, xmlns);
foreach (XPathNavigator node in selection)
{
// Here, node.OuterXml includes an explicit namespace.
// If the original raw xml fragment for this node was
// <ElementName>Text</ElementName>
// and if xmlns="urn:myxnlnamespace" is used on the root of the document....
//
// OuterXml will return
// <ElementName xmlns="urn:myxnlnamespace">Text</ElementName>
//
// InnerXml will return "Text" in this example.
//
// How can I get the original, raw XML bytestream for this node?
// Like this:
// <ElementName>Text</ElementName>
//
}
私にとっては、選択したノードの最初と最後の両方のIXmlLineInfoを取得することもできます。ここで、選択したノードの先頭に移動して、そのノードの IXmlLineInfo を取得できます。しかし、次のノード (MoveToNext()) に移動する方法しか知りません。現在のノードの最後に移動する方法がわかりません。また、問題のノードがシーケンスの最後のノードである場合 (兄弟がいない場合)、このアプローチは機能しません。
現在のノードの生のテキスト全体を返す xpath 式がある場合にも機能します。今のところ、私もそのようなものを見つけることができません。
編集:恥知らずなハックでこの問題を乗り越えました。強調表示する必要があるテキストの長さを判断するために、元の xml テキストを手動で解析し、山かっこと名前トークンを検索します。見栄えはよくありませんが、他に優れた点がなければ、単純な XML ファイルで機能します。
誰かが持っているなら、私はまだ本当の答えに興味があります。