我有一个XML文档,想要做语法高亮。是否可以从XPathNavigator中检索原始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文件。
我仍然对真正的答案感兴趣,如果任何人有一个。
@Cheeso我认为没有比过去9 - 10年IE提供的更好的解决方案。这就是为什么我推荐XPath Visualizer这样做的原因,它基本上是IE样式表的改编,所以现在它被写入兼容的XSLT 1.0中(而不是微软的旧版xsl方言)。 – 2009-09-18 13:10:02
该方法是否会生成HTML?那么我如何将突出显示应用于XML文档中的节点集? – Cheeso 2009-09-18 14:25:28
正如我在回答中所说的,研究XPath Visualizer的代码! :)如果您不敢从topxml.com获得XPath Visualizer(该网站充满了特洛伊木马!!!),请通过dnovatchev与我联系gmail dot com – 2009-09-18 23:09:59