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);