XPathNavigatorから元のXMLを取得することは可能ですか?
-
08-07-2019 - |
質問
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())に移動する方法しか知りません。現在のノードの end に移動する方法がわかりません。また、問題のノードがシーケンスの最後である(兄弟がもうない)場合、このアプローチは機能しません。
現在のノードの完全な未加工テキストを返すxpath式がある場合にも機能します。これまでのところ、私もそのようなものを見つけることができません。
編集:恥知らずなハックでこの問題を乗り越えました。強調表示する必要があるテキストの長さを判断するには、元のxmlテキストを手動で解析し、山括弧と名前トークンを検索します。きれいではありませんが、より良いものがなければ、単純なXMLファイルで機能します。
誰かが答えを持っているなら、私はまだ本当の答えに興味があります。
解決
XPath Visualizer は、XMLドキュメントの構文ハイライトを実行します。
所属していません StackOverflow