Parsear XML con (.) y (:) en "tag names" usando simpleXml de PHP

Iniciado por jdomgo3, 10 Febrero 2014, 10:13 AM

0 Miembros y 1 Visitante están viendo este tema.

jdomgo3

Hola a todos,
llevo un par de días probando varias cosas pero no lo consigo, el caso es que hay información en la web sobre cómo parsear xml cuando este tiene dos puntos en los namespaces pero mi problema va un poco mas allá, este es un fragmento del xml (en realidad es un XMI, no un XML) que quiero parsear:

Código (xml) [Seleccionar]

<?xml version="1.0" encoding="UTF-8"?>
<com.ibm.ejs.models.base.bindings.webappbnd:WebAppBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:com.ibm.ejs.models.base.bindings.webappbnd="webappbnd.xmi" xmi:id="WebAppBinding_1267660235297" virtualHostName="ABCD_01">
  <webapp href="WEB-INF/web.xml#WebApp_1267500236267"/>
</com.ibm.ejs.models.base.bindings.webappbnd:WebAppBinding>


Necesito quedarme con el item virtualHostName que pertenece al nodo com.ibm.ejs.models.base.bindings.webappbnd:WebAppBinding y este nombre tiene puntos ( . ) y dos puntos ( : ), ¿alguna idea?

Esto es lo último que he probado, sin éxito:

Código (php) [Seleccionar]

$loadIbmWebBnd = simplexml_load_file(archivo.xmi);
foreach($loadIbmWebBnd->com.ibm.ejs.models.base.bindings.webappbnd:WebAppBinding as $vH) {
echo $vH[virtualHostName];
}



Un saludo y muchas gracias de antemano.

jdomgo3

#1
La parte de los dos puntos está "apañada" y digo apañada por que en realidad no uso un parseador para tratar este dato, si no que directamente elimino los dos puntos y con eso me funciona en aquellos nodos que contienen los dos puntos ( : ) y no contienen puntos ( . ), por ejemplo:

Código (xml) [Seleccionar]

<host:VirtualHost xmi:id="VirtualHost_1391153615303" name="ABCD">
<mimeTypes xmi:id="MimeEntry_1391153615303" type="application/RAL">
<extensions>RAL</extensions>
<extensions>ral</extensions>
</mimeTypes>
</host:VirtualHost>


Para parsear el namespace host:VirtualHost y obtener el valor de la propiedad name lo que hago es eliminar los dos puntos de la siguiente manera con la función preg_replace y luego parseo el contenido como string (no como archivo) con la función simplexml_load_string:

Código (php) [Seleccionar]

$loadArchivoXml = file_get_contents(archivo.xml);
$loadArchivoXml = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $loadArchivoXml);
$loadArchivoXml = simplexml_load_string($loadArchivoXml);
foreach($loadArchivoXml->hostVirtualHost as $virtualHost) {
echo "El valor de la propiedad name es: ".$virtualHost['name'];
}


Siendo la salida...

Código (txt) [Seleccionar]
El valor de la propiedad name es: ABCD

Solo pongo esto por si alguno tiene el problema de parsear namespaces con dos puntos ( : ), pero no es la solución a mi problema, ya que sigo sin saber cómo tratar los namespaces con puntos ( . ) y haciendo el mismo proceso no meha funcionado  :-(, a ver si a alguno de vosotros se os ocurre alguna idea mejor. Pongo otra vez el trozo de XML con el que quiero trabajar:

Código (xml) [Seleccionar]

<?xml version="1.0" encoding="UTF-8"?>
<com.ibm.ejs.models.base.bindings.webappbnd:WebAppBinding xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:com.ibm.ejs.models.base.bindings.webappbnd="webappbnd.xmi" xmi:id="WebAppBinding_1267660235297" virtualHostName="ABCD_01">
  <webapp href="WEB-INF/web.xml#WebApp_1267500236267"/>
</com.ibm.ejs.models.base.bindings.webappbnd:WebAppBinding>



Un saludo y gracias de antemano.