2010-07-12 16 views
5

Estoy tratando de buscar un elemento xml desde el elemento raíz del archivo sobre la base de texto interno. He intentado esto, pero no funcionó:Encontrar un elemento en xml por su texto interno

rootElRecDocXml.SelectSingleNode("/ArrayOfRecentFiles[name='"+mFilePath+"']"); 

Conozco el camino de la vieja escuela que atravesar todo elemento de archivo de elemento pero no quiero hacer eso.

Tenga en cuenta que: mi nombre root elemento es ArrayOfRecentFiles y mi nombre de elemento secundario son RecentFile

Respuesta

5

Tendríamos que ver el xml; @Lee da el enfoque correcto aquí, así que algo como:

var el = rootElRecDocXml.SelectSingleNode(
      "/ArrayOfRecentFiles/RecentFile[text()='"+mFilePath+"']"); 

(tomando tu edición/respuesta en cuenta)

Sin embargo! Hay un montón de trampas:

  • la consulta será entre mayúsculas y minúsculas
  • de espacio en blanco será significativo (por lo <foo>abc</foo> es diferente a <foo> abc[newline]</foo> etc - ídem retorno de carro)
  • espacios de nombres XML son significativas, por lo es posible que tenga .SelectSingleNode("/alias:ArrayOfRecentFiles[text()='"+mFilePath+"']", nsmgr);, donde nsmgr es el espacio de nombres-manager

Para dar un ejemplo completo, que coincide tu comentario:

XmlDocument rootElRecDocXml = new XmlDocument(); 
rootElRecDocXml.LoadXml(@"<ArrayOfRecentFiles> <RecentFile>C:\asd\1\Examples\8389.atc</RecentFile> <RecentFile>C:\asd\1\Examples\8385.atc</RecentFile> </ArrayOfRecentFiles>"); 
string mFilePath = @"C:\asd\1\Examples\8385.atc"; 
var el = rootElRecDocXml.SelectSingleNode(
    "/ArrayOfRecentFiles/RecentFile[text()='" + mFilePath + "']"); 

Aquí, el es nonull después de la llamada SelectSingleNode. Encuentra el nodo.

+0

la anterior es mi xml – PUG

+0

este es mi xml: C: \ asd \ 1 \ Ejemplos \ 8389.atc C: \ asd \ 1 \ Ejemplos \ 8385.atc \t PUG

+0

@jaminator - ver actualización –

3

Es necesario utilizar "Texto()" para comprobar contra el texto interior de un elemento de la siguiente manera.

rootElRecDocXml.SelectSingleNode("/ArrayOfRecentFiles[text()='"+mFilePath+"']"); 
+0

se vuelve nula – PUG

+0

Pruebe esto, entonces no se dio cuenta que tenía un rootElRecDocXml.SelectSingleNode nivel de nodo hijo adicional ("/ ArrayOfRecentFiles/RecentFile [Texto() = ' "+ mFilePath +"']"); –

Cuestiones relacionadas