2009-09-17 46 views
1

我有一个XML文档,想要做语法高亮。是否可以从XPathNavigator中检索原始XML?

该代码使用XPathDocument,XPathNavigatorXPathNodeIterator。 我打电话给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文件。

我仍然对真正的答案感兴趣,如果任何人有一个。

+0

@Cheeso我认为没有比过去9 - 10年IE提供的更好的解决方案。这就是为什么我推荐XPath Visualizer这样做的原因,它基本上是IE样式表的改编,所以现在它被写入兼容的XSLT 1.0中(而不是微软的旧版xsl方言)。 – 2009-09-18 13:10:02

+0

该方法是否会生成HTML?那么我如何将突出显示应用于XML文档中的节点集? – Cheeso 2009-09-18 14:25:28

+0

正如我在回答中所说的,研究XPath Visualizer的代码! :)如果您不敢从topxml.com获得XPath Visualizer(该网站充满了特洛伊木马!!!),请通过dnovatchev与我联系gmail dot com – 2009-09-18 23:09:59

回答

0

您可能会发现XPath Visualizer对XML文档执行语法高亮的方式很有用。

+0

谢谢,Dimitre。你的工具已经过了很长时间了,呃?我想要我自己的,所以我建立了一个。 http://XpathVisualizer.codeplex.com我试图突出显示工作时遇到了这个问题。 – Cheeso 2009-09-18 03:45:36

+0

@Cheeso我不认为有一个明显更好的解决方案,比IE在过去9 - 10年提供的更好。这就是为什么我推荐XPath Visualizer这样做的原因,它基本上是IE样式表的改编,所以现在它被写入兼容的XSLT 1.0中(而不是微软的旧版xsl方言)。 – 2009-09-18 13:09:28

相关问题