Comunidad Gambas-es

Versión completa: , pero no del todo. Clave directa para XML similar a Key de TreeView
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola a todos:
¿Existe alguna manera de acceder directamente a un elemento de un XML de manera similar a cómo se hace con «.Key» de un TreeView?
Ahora mismo estoy accediendo a los subelementos de un elemento así:

GAMBAS
  1. Public Sub trvProyecto_Select()
  2.  
  3.   Dim txtPaso As String
  4.   Dim Elemento As XmlElement
  5.   Dim Elementos As XmlElement[]
  6.   Dim Subel As XmlElement
  7.   Dim Subels As XmlElement[]
  8.   Dim Valores As New String[]
  9.   Dim i As Byte
  10.   
  11. 'Estos en realidad se leen de CDATA del XML
  12.   Dim Campos As String[] = ["contenido", "notas", "sinopsis"]
  13. 'Estos deberían ser constantes de la aplicación
  14.   Dim intContenido As Integer = 0
  15.   Dim intNotas As Integer = 1
  16.   Dim intSinopsis As Integer = 2
  17.  
  18.   Valores.Resize(Campos.Count)  
  19.   txtPaso = trvProyecto.Item.Key
  20.   lblActual.Caption = trvProyecto.Item.Text
  21.   Elemento = xmlObjeto.Root
  22.   Elementos = Elemento.GetChildrenByNamespace("id")
  23.   
  24.   For Each Elemento In Elementos
  25.     If Elemento.Value = txtPaso Then
  26.       For i = 0 To Campos.Max
  27.         Subels = Elemento.Parent.GetChildrenByNamespace(Campos[i],, 2)
  28.         If Subels.Count Then 
  29.           Subel = Subels[0]
  30.           Valores[i] = Subel.Value
  31.         Endif 
  32.       Next
  33.     Endif
  34.   Next
  35.   
  36. 'Y aquí ya se hacen «cositas» con los datos leídos.
  37.   txtPral.RichText = Valores[intContenido]
  38.  



¿Habría alguna manera menos aparatosa?
Muchas gracias compañeros.[/i][/i]
Hola
No sé si podría servirte el método GetElementsByTagName, de la clase XmlDocument.

Primero deberías cargar tu archivo en un XMLDocument y luego obtener los elementos a partir de la "etiqueta" que quieras mediante el método GetElementsByTagName que devuelve un array de XmlElements.

Saludos
Gracias, Juan, pero eso es exactamente lo que hago ahora con el código que he puesto de ejemplo. Quizá está mal planteada la pregunta. ¿Existe alguna manera de no tener que iterar para encontrar un elemento concreto del xmlDocument, tal cual se hace con el «.Key» del TreeView?
Jesús, me llamo Jesús Tongue Tongue

Entiendo la pregunta, pero al ser posible que existan elementos con la misma etiqueta dentro del árbol del documento, no creo que sea posible identificarlos a menos que los llames por el índice del array... no se me ocurre otra cosa. Si a priori no conoces el contenido del documento, no estoy seguro del procedimiento a seguir sin saber lo que pretendes o ver la estructura del XML.

En mi post sugiero el uso de GetElementByTagName, en lugar del que tu estás usando que es GetChildrenByNamespace. Si te he entendido bien, es posible que usando el Tag (etiqueta del nodo que buscas) sea más rápido. si hubiera solo un nodo con esa etiqueta llegarías en un solo paso, de otro modo no hay más remedio que iterar por los resultados que ambos métodos devuelven.

Saludos
Gracias, Jesús, y disculpa el «renombrado»  Big Grin
Nada, lo único parecido sería XmlElement.GetChildrenByAttributeValue. Pero no sé si sería mejor pasar «id» como atributo o dejarlo como está aunque la búsqueda sea más larga.