XmlDocument.SelectSingleNode tema y XMLNamespace
-
09-10-2019 - |
Pregunta
Estoy cargando una cadena a un documento XML que contiene la siguiente estructura:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Compile Include="clsWorker.cs" />
</ItemGroup>
</Project>
entonces im carga todo en XmlDocument:
XmlDocument xmldoc = new XmlDocument();
xmldoc.LoadXml(Xml);
a continuación, aparece el siguiente problema:
XmlNode Node = xmldoc.SelectSingleNode("//Compile"); // return null
Cuando quito el atributo xmlns del elemento raíz (Proyecto) su funcionamiento muy bien, ¿Cómo puedo mejorar mi SelectSingleNode para devolver el elemento relevante?
Solución
Se debe utilizar un XmlNamespaceManager en su llamada a SelectSingleNode () :
XmlNamespaceManager ns = new XmlNamespaceManager(xmldoc.NameTable);
ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
XmlNode node = xmldoc.SelectSingleNode("//msbld:Compile", ns);
Otros consejos
pierna derecha desde el documentación de SelectSingleNode()
en el MSDN :
Nota:
Si la expresión XPath no incluye un prefijo, se supone que la URI de espacio es el espacio de nombres vacío. Si el código XML incluye un defecto espacio de nombres, aún tiene que añadir un prefijo y URI de espacio a la XmlNamespaceManager; de lo contrario, no conseguirá un nodo seleccionado. Para más información, consulte Seleccionar nodos Usando XPath navegación .
Y el inmediatamente siguiente código de muestra es
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("ab", "http://www.lucernepublishing.com");
XmlNode book = doc.SelectSingleNode("//ab:book", nsmgr);
Es no href="https://stackoverflow.com/questions/809496/why-is-selectsinglenode-returning-null"> si este haría ser " href="https://stackoverflow.com/questions/1194675/c-and-xpath-how-to-query"> conocimiento". ; -)
Desde el 'ItemGroup' puede tener varios hijos 'Compilar' y desea específicamente a los niños de 'Proyecto / ItemGroup' la 'Compilar', la siguiente volverá toda la deseada 'Compilar' los niños y no otros:
XmlDocument projectDoc = new XmlDocument();
projectDoc.Load(projectDocPath);
XmlNamespaceManager ns = new XmlNamespaceManager(projectDoc.NameTable);
ns.AddNamespace("msbld", "http://schemas.microsoft.com/developer/msbuild/2003");
XmlNodeList xnList = projectDoc.SelectNodes(@"/msbld:Project/msbld:ItemGroup/msbld:Compile", ns);
Tenga en cuenta que los 'msbld:'. Necesidades de especificación de espacio de nombres para preceden a cada nivel de nodo
De esta manera no es necesario especificar espacio de nombres:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml("your xml");
XmlNode node = xmlDoc.SelectSingleNode("/*[local-name() = 'Compile']");
XmlNode nodeToImport = xmlDoc2.ImportNode(node, true);
xmlDoc2.AppendChild(nodeToImport);