【问题标题】:Is it possible to retrieve the original XML from XPathNavigator?是否可以从 XPathNavigator 检索原始 XML?
【发布时间】:2009-09-17 03:53:47
【问题描述】:

我有一个 XML 文档,想做语法高亮。

代码使用XPathDocumentXPathNavigatorXPathNodeIterator。 调用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 表达式返回当前节点的完整原始文本,它也会起作用。到目前为止,我也找不到类似的东西。


编辑:我通过一个无耻的 hack 解决了这个问题。为了确定需要突出显示的文本的长度,我手动解析原始 xml 文本,搜索尖括号和名称标记。它不是很漂亮,但在没有更好的东西的情况下,它适用于简单的 XML 文件。

我仍然对真正的答案感兴趣,如果有人有的话。

【问题讨论】:

  • @Cheeso 我认为没有比 IE 过去 9 到 10 年提供的解决方案更好的解决方案了。这就是为什么我推荐使用 XPath Visualizer 的方法,它本质上是对 IE 样式表的改编,因此它现在是用兼容的 XSLT 1.0 编写的(而不是微软的旧 xsl 方言)。
  • 这种方法会产生 HTML 吗?然后如何将高亮应用到 XML 文档中的节点集?
  • 正如我在回答中已经说过的,研究 XPath Visualizer 的代码! :) 如果您害怕从 topxml.com 获取 XPath Visualizer(该站点充满了木马!!!),请通过 dnovatchev at gmail dot com 与我联系
  • 我注意到那里的木马......

标签: .net xml xpath xpathnavigator


【解决方案1】:

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

【讨论】:

  • 谢谢,迪米特。你的工具已经存在很长时间了,是吗?我想要自己的,所以我建了一个。 XpathVisualizer.codeplex.com我在尝试突出显示时遇到了这个问题。
  • @Cheeso 我认为没有比 IE 过去 9 到 10 年提供的解决方案更好的解决方案了。这就是为什么我推荐使用 XPath Visualizer 的方法,它本质上是对 IE 样式表的改编,因此它现在是用兼容的 XSLT 1.0 编写的(而不是微软的旧 xsl 方言)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多