2012-02-27 8 views
10

Estoy tratando de crear una consulta/cadena XPath que capture un elemento específico de un documento XML. Estoy tratando de agarrar el elemento con la ID = 38 pero mi código siempre no arroja nada por alguna razón.XPath Cadena que atrapa un elemento con un valor de ID específico

Si mira mi código & la organización de mi archivo XML, ¿puede decirme qué XPath necesito para tomar el elemento con el id = 38?

Mi código es:

XmlDocument xdoc = new XmlDocument(); 
xdoc.Load(getProductURL()); 
XmlNode node = xdoc.DocumentElement.SelectSingleNode("id('38')"); 

// node always is null for some reason? 

La forma en que se organiza el xml es así:

<courseg> 
    <group isempty="False" isbranch="true" id="1" name="abc"> 
     <group isempty="False" isbranch="true" id="38" name="def"></group> 
    </group> 
</courseg> 

Respuesta

19

El XPath lo que necesita es

//*[@id='38'] 

Aquí está el ejemplo con XDocumento:

 XDocument xdoc = XDocument.Parse(@" 
<courseg> 
    <group isempty=""False"" isbranch=""true"" id=""1"" name=""abc""> 
     <group isempty=""False"" isbranch=""true"" id=""38"" name=""def""></group> 
    </group> 
</courseg>"); 
     XElement node = xdoc.Root.XPathSelectElement("//*[@id='38']"); 
     Console.WriteLine(node); 
3

Utilice esta consulta XPath:

//*[@id = 38] 

Se selecciona cada nodo con id atributo es igual a 38. Si usted tiene que ser más específicos, es decir, seleccionar group con id atributo es igual a 38, utilice la siguiente:

//group[@id = 38] 
-1

Cuando se menciona

xdoc.DocumentElement.SelectSingleNode("id('38')" 

que están pidiendo XmlDocument para buscar un nodo secundario en el interior nodo raíz cuyo nombre es 'id'. Pero idealmente 'id' es un atributo y no un xmlnodo.

Así que hay que utilizar //group[@id = '38'] para obtener toda nodo hijo que tenían el nombre 'grupo' y el atributo 'id' con un valor de 38

+0

Incorrecto. Eso no es lo que hace la función id(). –

5

La función id ('P38') se selecciona un elemento con un valor de ID de P38. Pero esto no solo significa "un atributo llamado 'id'". Significa que un atributo declarado en la DTD o esquema es de tipo ID. No ha mostrado un DTD o esquema, y ​​sospecho que no tiene uno. Si lo hizo, y si declaró que el atributo id es de tipo ID, entonces su documento no sería válido, porque un valor ID no puede ser totalmente numérico (por razones SGML heredadas, tiene que tomar la forma de un nombre).

En la práctica, la función id() es mejor evitarla a menos que tenga requisitos de rendimiento severos. Es demasiado frágil: solo funciona cuando se valida el documento de origen con un esquema o DTD. En XSLT, use la tecla() en su lugar. Alternativamente, muchos procesadores ahora reconocen el nombre de atributo xml: id como un valor de ID de "autodeclaración" sin referencia a un esquema o DTD: utilícelo si su procesador lo admite.

Cuestiones relacionadas