我有一个 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 文件。
我仍然对真正的答案感兴趣,如果有人有的话。