Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
Como les había comentado en el capítulo anterior, estoy pasando una aplicación vieeeeeja :senbe , que estaba en fedora Core 2, php 4 y oracle 8i a CentOS 7, php 5.4 y Oracle 11g.

Todo bien, he ido resolviendo de a poco los pequeños problemas asociados a funciones deprecadas. Pero ahora me enfrento a una clase completa escrita para parsear archivos XML que imposibilita seguir avanzando.

Los archivos de configuración son xml, del tipo

Código:
<usuario>Appuser</usuario>
<password>LaContraseñaEnteraDePulenta</password>
<basedatos>ORAPU</basedatos>


La cosa es que tuve que cambiar todas las funciones de la clase que parsea los archivos XML, TODAS LAS PUTAS FUNCIONES, y si bien es cierto no tira error, NO MUESTRA NADA.
Lo esperable es que yo le tire el archivo xml a la clase y ésta me devuelva los valores de los parámetros. Sin embargo, me devuelve todos los parámetros como nulos. La clase no tira error ni nada, simplemente me devuelve todo nulo.

¿Alguien ha trabajado con esto? Es algo más o menos así

Código:
public static function loadXML() {
        $params = Array();
                               
                $xmldoc = new DomDocument();

        if($xmldoc -> load(INCLUDE_PATH."webconfig.php")) {
            $root = $xmldoc->documentElement;               
            $nodes=$root->childnodes;

                        echo "Link ".$root->textContent." fin";

              foreach ($nodes as $node) {
               
                if ($node->node_type() == XML_ELEMENT_NODE) {
                    $key=$node->name();

                    if ($node->has_attributes()) {
                        $attributes = $node->attributes();
                        foreach($attributes as $attribute) {
                            $params[$key][$attribute->name()] = $attribute->get_content();
                        }
                    }

                    if ($node->has_child_nodes()) {
                        $child_nodes = $node->child_nodes();
                        foreach($child_nodes as $child) {
                            if ($child->node_type() == XML_ELEMENT_NODE) {
                                $params[$key][$child->name()] = $child->get_content();
                            }
                        }
                    }

                }
               
            }
        }
        return $params;
    }
 

Kitsune

Fanático
Se incorporó
5 Mayo 2006
Mensajes
1.029
podrias tirar el xml completo
derrepente solo falta que tenga su declaración o tengas que leer otro nodo padre??
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
podrias tirar el xml completo
derrepente solo falta que tenga su declaración o tengas que leer otro nodo padre??

Todavía me quedaban funciones obsoletas. Las cambié y avancé pero sigue sin parsear el xml. Voy a ahondar un poco y les vuelvo a preguntar.
 
Upvote 0

Cosme

Gold Member
Se incorporó
27 Febrero 2005
Mensajes
8.276
Depende que quieras hacer.

Si los xml no tienen namespaces, simplexml funciona bastante "simple"; podrías darle una vuelta a ver si te sirve.

<root>
<elemento>
<name id="1">nombre1</name>
</elemento>
</root>

$xml = simplexml_load_string($string) //string = xml valido

$xml->elemento->name // nombre1
$xml->elemento->name->attributes()->id // 1
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
Depende que quieras hacer.

Si los xml no tienen namespaces, simplexml funciona bastante "simple"; podrías darle una vuelta a ver si te sirve.

<root>
<elemento>
<name id="1">nombre1</name>
</elemento>
</root>

$xml = simplexml_load_string($string) //string = xml valido

$xml->elemento->name // nombre1
$xml->elemento->name->attributes()->id // 1

Estuve googleando y caché que la opción de simplexml es mejor, pero esta huevada ya está hecha a la antigua y se me complica cambiarla mucho.
 
Upvote 0

unreal4u

I solve problems.
Miembro del Equipo
ADMIN
Se incorporó
2 Octubre 2005
Mensajes
13.465
Tal como dice Cosme, si no tienes que trabajar con namespaces y otras cosas más complicadas, SimpleXML es la mejor manera.

DomDocument tiene su propio set de herramientas, y muchas tienen quirks bastante peculiares.

Deja un ejemplo del XML, lo más probable es que las herramientas estén y simplemente necesitas un empujoncito pal lado correcto ;)

Si fuiste inteligente, lo habrás hecho con un interface, de esa forma sólo tendrás que escribir la implementación que puede variar por debajo :)

Saludos.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
Tal como dice Cosme, si no tienes que trabajar con namespaces y otras cosas más complicadas, SimpleXML es la mejor manera.

DomDocument tiene su propio set de herramientas, y muchas tienen quirks bastante peculiares.

Deja un ejemplo del XML, lo más probable es que las herramientas estén y simplemente necesitas un empujoncito pal lado correcto ;)

Si fuiste inteligente, lo habrás hecho con un interface, de esa forma sólo tendrás que escribir la implementación que puede variar por debajo :)

Saludos.

No lo hice yo, lo hizo una empresa desarrolladora hace más de 10 años en php 4.

Voy avanzando. Apenas tenga una duda más concreta la lanzo por acá.
 
Upvote 0

Cosme

Gold Member
Se incorporó
27 Febrero 2005
Mensajes
8.276
Como les había comentado en el capítulo anterior, estoy pasando una aplicación vieeeeeja :senbe , que estaba en fedora Core 2, php 4 y oracle 8i a CentOS 7, php 5.4 y Oracle 11g.

Todo bien, he ido resolviendo de a poco los pequeños problemas asociados a funciones deprecadas. Pero ahora me enfrento a una clase completa escrita para parsear archivos XML que imposibilita seguir avanzando.

Los archivos de configuración son xml, del tipo

Código:
<usuario>Appuser</usuario>
<password>LaContraseñaEnteraDePulenta</password>
<basedatos>ORAPU</basedatos>


La cosa es que tuve que cambiar todas las funciones de la clase que parsea los archivos XML, TODAS LAS PUTAS FUNCIONES, y si bien es cierto no tira error, NO MUESTRA NADA.
Lo esperable es que yo le tire el archivo xml a la clase y ésta me devuelva los valores de los parámetros. Sin embargo, me devuelve todos los parámetros como nulos. La clase no tira error ni nada, simplemente me devuelve todo nulo.

¿Alguien ha trabajado con esto? Es algo más o menos así

Código:
public static function loadXML() {
        $params = Array();
                              
                $xmldoc = new DomDocument();

        if($xmldoc -> load(INCLUDE_PATH."webconfig.php")) {
            $root = $xmldoc->documentElement;              
            $nodes=$root->childnodes;

                        echo "Link ".$root->textContent." fin";

              foreach ($nodes as $node) {
              
                if ($node->node_type() == XML_ELEMENT_NODE) {
                    $key=$node->name();

                    if ($node->has_attributes()) {
                        $attributes = $node->attributes();
                        foreach($attributes as $attribute) {
                            $params[$key][$attribute->name()] = $attribute->get_content();
                        }
                    }

                    if ($node->has_child_nodes()) {
                        $child_nodes = $node->child_nodes();
                        foreach($child_nodes as $child) {
                            if ($child->node_type() == XML_ELEMENT_NODE) {
                                $params[$key][$child->name()] = $child->get_content();
                            }
                        }
                    }

                }
              
            }
        }
        return $params;
    }

no recuerdo que en domDocument exista un "has_attributes", creo que era hasAttribute
http://php.net/manual/en/domnode.hasattributes.php
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
no recuerdo que en domDocument exista un "has_attributes", creo que era hasAttribute
http://php.net/manual/en/domnode.hasattributes.php

Si, estoy todavía cambiando funciones deprecadas por las actuales.

Ahora estoy pegado en que no me devuelve el nombre del atributo. Onda

Código:
<Usuario>Zuljin</Usuario>

Ya, me devuelve "Zuljin" pero no reconoce el atributo "Usuario". Estoy usando esto

Código:
if ($node->nodeType == XML_ELEMENT_NODE) {

                    $key=$node->name;
                    echo "Key Node: ".$key." ";   -> Me devuelve key vacío, nada. 

                    if ($node->hasAttributes()) {
                       
                                       $attributes = $node->attributes;

                           foreach($attributes as $attribute) {

                            $params[$key][$attribute->name] = $attribute->textContent;
                                                     

                        }
                    }

                    if ($node->hasChildNodes()) {

                        $child_nodes = $node->childNodes;
                        foreach($child_nodes as $child) {
                            if ($child->nodeType == XML_ELEMENT_NODE) {
                                                               
                                $params[$key][$child->name] = $child->textContent;
                                                                 
                            }
                        }
                    }

                }
 
Upvote 0

Cosme

Gold Member
Se incorporó
27 Febrero 2005
Mensajes
8.276
Si, estoy todavía cambiando funciones deprecadas por las actuales.

Ahora estoy pegado en que no me devuelve el nombre del atributo. Onda

Código:
<Usuario>Zuljin</Usuario>

Ya, me devuelve "Zuljin" pero no reconoce el atributo "Usuario". Estoy usando esto

Código:
if ($node->nodeType == XML_ELEMENT_NODE) {

                    $key=$node->name;
                    echo "Key Node: ".$key." ";   -> Me devuelve key vacío, nada.

                    if ($node->hasAttributes()) {
                      
                                       $attributes = $node->attributes;

                           foreach($attributes as $attribute) {

                            $params[$key][$attribute->name] = $attribute->textContent;
                                                    

                        }
                    }

                    if ($node->hasChildNodes()) {

                        $child_nodes = $node->childNodes;
                        foreach($child_nodes as $child) {
                            if ($child->nodeType == XML_ELEMENT_NODE) {
                                                              
                                $params[$key][$child->name] = $child->textContent;
                                                                
                            }
                        }
                    }

                }

En tu ejemplo, usuario es el nombre del nodo ($child->name) , pero no tiene attributos <Usuario id="1">Zuljin</Usuario>
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
En tu ejemplo, usuario es el nombre del nodo ($child->name) , pero no tiene attributos <Usuario id="1">Zuljin</Usuario>

Vale. Estoy entendiendo como funciona esta huevada para poder corregir y cambiar lo que haya que cambiar.
 
Upvote 0

Zuljin

Fundador
Miembro del Equipo
Fundador
ADMIN
Se incorporó
15 Enero 2004
Mensajes
11.766
Ya, avancé algo. Aunque ahora estoy en otro error, por lo menos salí del cacho.

Decía

Código:
$key=$node->name;

Debía decir

Código:
$key=$node->nodeName;

y con eso comenzó a devolver los valores del arreglo.
 
Upvote 0

Cosme

Gold Member
Se incorporó
27 Febrero 2005
Mensajes
8.276
Ya, avancé algo. Aunque ahora estoy en otro error, por lo menos salí del cacho.

Decía

Código:
$key=$node->name;

Debía decir

Código:
$key=$node->nodeName;

y con eso comenzó a devolver los valores del arreglo.

por esas mierdas es que hay que usar un IDE :risas
 
Upvote 0
Subir