Buenas amigos
Como varios me han pedido alguna ayuda con esto de los XML, entiendo que esto os puede facilitar la vida,
vida durilla del programata cuando nos metemos con XML y demás
Os dejo un codigo que os puede ayudar a manejar XML de SOLO ELEMENTOS, no tiene en cuenta ATRIBUTOS.
La idea es convertir XML en un Hash , en el cual podamos acceder a todos los miembros.
No encontrado o desconozco si hay algo parecido, si existe algo similar, please, decírmelo
Por ejemplo este XML;
Podemos acceder de la siguiente manera;
También esta publicado ahora en blog: http://xthefull.blogspot.com.es/2015/11/convertir-xml-hash-en-harbour.html
Como varios me han pedido alguna ayuda con esto de los XML, entiendo que esto os puede facilitar la vida,
vida durilla del programata cuando nos metemos con XML y demás
Os dejo un codigo que os puede ayudar a manejar XML de SOLO ELEMENTOS, no tiene en cuenta ATRIBUTOS.
La idea es convertir XML en un Hash , en el cual podamos acceder a todos los miembros.
No encontrado o desconozco si hay algo parecido, si existe algo similar, please, decírmelo
Por ejemplo este XML;
<?xml version="1.0" encoding="utf-8"?>
<data>
<node1></node1>
<node2>val2</node2>
<node3>val3</node3>
<group>
<node1>val4</node1>
<node2>val5</node2>
<node3>val6</node3>
</group>
<group>
<node1>val24</node1>
<node2>val25</node2>
<node3>val26</node3>
<extras>
<node1>Extra_val24</node1>
<node2>Extra_val25</node2>
<node3>Extra_val26</node3>
</extras>
</group>
<node7>val7</node7>
<node8>val8</node8>
</data>Podemos acceder de la siguiente manera;
pRoot := mxmlLoadString( NIL, hb_MemoRead( file ), @type_cb() )
hHash := XMLtoHash( pRoot, "data" )
// Podemos acceder fácilmente ;
?? hHash["node2"] // Muestra val2
?? hHash["group"][1]["node1"] // Muestra val4
?? hHash["group"][2]["extras"][1]["node1"] // Muestra Extra_val24FUNCTION XMLtoHash( pRoot, cElement )
Local pNode, hNext
Local Map := {=>}
if empty( cElement )
pNode := pRoot
else
pNode := mxmlFindElement( pRoot, pRoot, cElement, NIL, NIL, MXML_DESCEND )
endif
IF Empty( pNode )
RETURN Map
ENDIF
hNext := mxmlWalkNext( pNode, pNode, MXML_DESCEND )
Map := NodeToHash( hNext )
return Map
STATIC FUNCTION NodeToHash( node )
Local wt := 0
Local hNext
Local hHashChild := {=>}
Local hHash := {=>}
WHILE node != NIL
IF mxmlGetType( node ) == MXML_ELEMENT
//OutStd( "Element[" + mxmlGetElement( node ) + "]" + " Valor[" + mxmlGetText( node,@wt ) + "]" +hb_eol() )
if HB_HHASKEY( hHash, mxmlGetElement( node ) )
if valtype( hHash[ mxmlGetElement( node ) ] ) <> "A"
hHash[ mxmlGetElement( node ) ] := mxmlGetText( node,@wt )
else
// Es un array, por lo tanto, no lo tocamos
endif
else
hHash[ mxmlGetElement( node ) ] := mxmlGetText( node,@wt )
endif
if empty( mxmlGetText( node,@wt ) ) // Miramos dentro
hNext := mxmlWalkNext( node, node, MXML_DESCEND )
if hNext != NIL
if empty( hHash[ mxmlGetElement( node ) ] )
// OutStd( "esta vacio----> creo array " )
hHash[ mxmlGetElement( node ) ] := {}
endif
//OutStd("Recursiva")
hHashChild := NodeToHash( hNext )
if hHashChild != NIL
AADD( hHash[ mxmlGetElement( node ) ], hHashChild )
endif
endif
endif
ENDIF
node := mxmlGetNextSibling( node )
END WHILE
return hHashTambién esta publicado ahora en blog: http://xthefull.blogspot.com.es/2015/11/convertir-xml-hash-en-harbour.html
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)