Comunidad Gambas-es
[SOLUCIONADO] , pero no del todo. Clave directa para XML similar a Key de TreeView - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Controles/Librerías/Componentes (https://gambas-es.org/forum-7.html)
+--- Tema: [SOLUCIONADO] , pero no del todo. Clave directa para XML similar a Key de TreeView (/thread-545.html)



, pero no del todo. Clave directa para XML similar a Key de TreeView - Grandamakulo - 22-08-2021

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í:

Código:
Public Sub trvProyecto_Select()

  Dim txtPaso As String
  Dim Elemento As XmlElement
  Dim Elementos As XmlElement[]
  Dim Subel As XmlElement
  Dim Subels As XmlElement[]
  Dim Valores As New String[]
  Dim i As Byte
  
'Estos en realidad se leen de CDATA del XML
  Dim Campos As String[] = ["contenido", "notas", "sinopsis"]
'Estos deberían ser constantes de la aplicación
  Dim intContenido As Integer = 0
  Dim intNotas As Integer = 1
  Dim intSinopsis As Integer = 2

  Valores.Resize(Campos.Count)  
  txtPaso = trvProyecto.Item.Key
  lblActual.Caption = trvProyecto.Item.Text
  Elemento = xmlObjeto.Root
  Elementos = Elemento.GetChildrenByNamespace("id")
  
  For Each Elemento In Elementos
    If Elemento.Value = txtPaso Then
      For i = 0 To Campos.Max
        Subels = Elemento.Parent.GetChildrenByNamespace(Campos[i],, 2)
        If Subels.Count Then 
          Subel = Subels[0]
          Valores[i] = Subel.Value
        Endif 
      Next
    Endif
  Next
  
'Y aquí ya se hacen «cositas» con los datos leídos.
  txtPral.RichText = Valores[intContenido]

End

¿Habría alguna manera menos aparatosa?
Muchas gracias compañeros.[/i][/i]


RE: Clave directa para XML similar a Key de TreeView - jguardon - 22-08-2021

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


RE: Clave directa para XML similar a Key de TreeView - Grandamakulo - 22-08-2021

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?


RE: Clave directa para XML similar a Key de TreeView - jguardon - 22-08-2021

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


RE: Clave directa para XML similar a Key de TreeView - Grandamakulo - 22-08-2021

Gracias, Jesús, y disculpa el «renombrado»  Big Grin


RE: Clave directa para XML similar a Key de TreeView - Grandamakulo - 23-08-2021

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.