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?

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top