代码之家  ›  专栏  ›  技术社区  ›  Cheeso

是否可以从XPathNavigator检索原始XML?

  •  1
  • Cheeso  · 技术社区  · 15 年前

    我有一个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文件。

    1 回复  |  直到 15 年前
        1
  •  0
  •   Dimitre Novatchev    15 年前

    你可能会发现这种方法很有用 XPath Visualizer 执行XML文档的语法hilighting。