Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlNamespaceManager从XmlNode中选择_C#_.net_Xml - Fatal编程技术网

C# 使用XmlNamespaceManager从XmlNode中选择

C# 使用XmlNamespaceManager从XmlNode中选择,c#,.net,xml,C#,.net,Xml,我一直在寻找从具有多个名称空间的XmlNode(而不是XmlDocument)中选择节点的方法 几乎我搜索过的每一篇帖子都建议我使用XmlNamespaceManager,然而,XmlNamespaceManager需要XmlNameTable,而XmlNode不存在该表 我尝试使用XmlDocument执行此操作,因为XmlDocument有一个属性XmlDocument.NameTable,但它对于XmlNode不存在 我尝试手动创建一个NameTable,但是当我使用XmlDocument

我一直在寻找从具有多个名称空间的
XmlNode
(而不是
XmlDocument
)中选择节点的方法

几乎我搜索过的每一篇帖子都建议我使用
XmlNamespaceManager
,然而,
XmlNamespaceManager
需要
XmlNameTable
,而
XmlNode
不存在该表

我尝试使用
XmlDocument
执行此操作,因为
XmlDocument
有一个属性
XmlDocument.NameTable
,但它对于XmlNode不存在

我尝试手动创建一个NameTable,但是当我使用
XmlDocument
时,它不能像同一段代码那样工作。我想我需要用一些东西填充该名称表,或者以某种方式将其绑定到
XmlNode
以使其正常工作。请建议

你能用吗

XPathNavigator nav = XmlNode.CreateNavigator();
XmlNamespaceManager man = new XmlNamespaceManager(nav.NameTable);
包括其余部分,以防有帮助:

man.AddNamespace("app", "http://www.w3.org/2007/app"); //Gotta add each namespace
XPathNodeIterator nodeIter = nav.Select(xPathSearchString, man);

while (nodeIter.MoveNext())
{
    var value = nodeIter.Current.Value;
}

由于某些原因,XmlNamespaceManager不会自动加载文档中定义的名称空间(这似乎是一个简单的期望)。出于某种原因,名称空间声明被视为属性。我能够使用以下代码自动添加名称空间

private static XmlNamespaceManager AddNamespaces(XmlDocument xmlDoc)
{
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
    AddNamespaces(xmlDoc.ChildNodes, nsmgr);
    return nsmgr;
}
private static void AddNamespaces(XmlNodeList nodes, XmlNamespaceManager nsmgr) {
    if (nodes == null)
        throw new ArgumentException("XmlNodeList is null");

    if (nsmgr == null)
        throw new ArgumentException("XmlNamespaceManager is null");

    foreach (XmlNode node in nodes)
    {
        if (node.NodeType == XmlNodeType.Element)
        {
            foreach (XmlAttribute attr in node.Attributes)
            {
                if (attr.Name.StartsWith("xmlns:"))
                {
                    String ns = attr.Name.Replace("xmlns:", "");
                    nsmgr.AddNamespace(ns, attr.Value);
                }
            }
            if (node.HasChildNodes)
            {
                nsmgr.PushScope();
                AddNamespaces(node.ChildNodes, nsmgr);
                nsmgr.PopScope();
            }
        }
    }
}
示例调用示例:

    XmlDocument ResponseXmlDoc = new System.Xml.XmlDocument();
    ...<Load your XML Document>...
    XmlNamespaceManager nsmgr = AddNamespaces(ResponseXmlDoc);
XmlNodeList list = ResponseXmlDoc.SelectNodes("//d:response", nsmgr);