zoukankan      html  css  js  c++  java
  • .NET XmlNavigator with Namespace

    In .NET 2.0 there is additional overload that accepts string expression
    and IXmlNamespaceResolver (XmlNamespaceManager implements it) - see
    http://msdn2.microsoft.com/en-us/library/6k4x060d.aspx.

    XPathDocument document = new XPathDocument("contosoBooks.xml");
    XPathNavigator navigator 
    = document.CreateNavigator();

    XmlNamespaceManager manager 
    = new XmlNamespaceManager(navigator.NameTable);
    manager.AddNamespace(
    "bk""http://www.contoso.com/books");

    XPathNodeIterator nodes 
    = navigator.Select("/bk:bookstore/bk:book", manager);
    XPathNavigator nodesNavigator 
    = nodes.Current;

    XPathNodeIterator nodesText 
    = nodesNavigator.SelectDescendants(XPathNodeType.Text, false);

    while (nodesText.MoveNext())
    {
        Console.Write(nodesText.Current.Name);
        Console.WriteLine(nodesText.Current.Value);
    }


    In .NET 1.1 you have no choice but to compile XPathExpression manually:

    XPathExpression expr = nav.Compile("book/@bk:ISBN");
    XmlNamespaceManager mngr = new XmlNamespaceManager(new NameTable());
    mngr.AddNamespace("bk","urn:samples");
    expr.SetContext(mngr);
    XPathNodeIterator ni = nav.Select(expr);

    See
    http://msdn.microsoft.com/library/d...ecttopic2 .asp

    --------------------------------------------------------------------------------


    Thanks Oleg, it works a treat (but what a polaver though).

    One small follow-up if I may. I would have thought that if I initialized the
    namespace manager like this:

    XmlNamespaceManager mngr = new XmlNamespaceManager(nav.NameTable);

    then it would pick up the namespace prefixes from the document. However, it
    doesn't (I still need to do the AddNamespace calls)

     --------------------------------------------------------------------------------

    No, first of all NameTable has nothing to do with namespaces - it's just
    a collection of atomic strings (names) used to save memory and speed
    up name comparisons. Second - there is no such thing as "prefixes from
    the document" as in XML document namespace prefixes can be overriden and
    undeclared in any order.

    The NameTable is used to speed up string comparison, there is nothing
    done like "picking up namespace prefixes".
    As said, with .NET 2.0 you have some way to use the XPathNavigator
    itself, once moved to the proper node you want to "pick up namespace
    prefixes" from, itself as the namespace manager.
    <http://groups.google.com/group/microsoft.public.dotnet.xml/msg/af7d7f9e2f422d7e?hl=en&>

  • 相关阅读:
    函数模板
    c#使用多线程的几种方式示例详解
    C#中数组、ArrayList和List三者的区别
    c# Thread类
    IEnumerable和IEnumerator 详解
    C#执行CMD命令并接收返回结果的实现方法
    C# Process.Start()方法详解
    C#Json转Xml格式数据的方法
    sql存储过程
    SQL存储过程基础
  • 原文地址:https://www.cnblogs.com/mrfangzheng/p/1140591.html
Copyright © 2011-2022 走看看