php - simplexmlelement - xml-> getnamespaces
Eliminar el espacio de nombres de XML usando PHP (4)
El siguiente código PHP detecta automáticamente el espacio de nombres predeterminado especificado en el archivo XML bajo el alias "predeterminado". No es necesario actualizar todas las consultas de xpath para incluir el prefijo default:
Por lo tanto, si desea leer archivos XML en lugar de que contengan una definición de NS predeterminada o no, y desea consultar todos los elementos de Something
, puede usar el siguiente código:
$xml = simplexml_load_file($name);
$namespaces = $xml->getDocNamespaces();
if (isset($namespaces[''''])) {
$defaultNamespaceUrl = $namespaces[''''];
$xml->registerXPathNamespace(''default'', $defaultNamespaceUrl);
$nsprefix = ''default:'';
} else {
$nsprefix = '''';
}
$somethings = $xml->xpath(''//''.$nsprefix.''Something'');
echo count($somethings).'' times found'';
Tengo un documento XML que se ve así:
<Data
xmlns="http://www.domain.com/schema/data"
xmlns:dmd="http://www.domain.com/schema/data-metadata"
>
<Something>...</Something>
</Data>
Estoy analizando la información usando SimpleXML en PHP. Estoy tratando con matrices y parece que estoy teniendo un problema con el espacio de nombres.
Mi pregunta es: ¿Cómo elimino esos espacios de nombres? Leí los datos de un archivo XML.
¡Gracias!
Encontré que la respuesta anterior era útil, pero no me funcionó del todo. Esto terminó trabajando mejor:
// Gets rid of all namespace definitions
$xml_string = preg_replace(''/xmlns[^=]*="[^"]*"/i'', '''', $xml_string);
// Gets rid of all namespace references
$xml_string = preg_replace(''/[a-zA-Z]+:([a-zA-Z]+[=>])/'', ''$1'', $xml_string);
Para eliminar completamente el espacio de nombres, deberá usar Expresiones regulares (RegEx). Por ejemplo:
$feed = file_get_contents("http://www.sitepoint.com/recent.rdf");
$feed = preg_replace("/<.*(xmlns *= *[/"''].[^/"'']*[/"'']).[^>]*>/i", "", $feed); // This removes ALL default namespaces.
$xml_feed = simplexml_load_string($feed);
Luego, ha eliminado los espacios de nombres xml antes de cargar el XML (tenga cuidado con la expresión regular a través, porque si tiene campos con algo como:
<![CDATA[ <Transfer xmlns="http://redeux.example.com">cool.</Transfer> ]]>
Luego, eliminará los xmlns del CDATA, lo que puede llevar a resultados inesperados.
Si está usando XPath, entonces es una limitación con XPath y no con PHP. Mire esta explicación en xpath y los espacios de nombres predeterminados para obtener más información.
Más específicamente, es el atributo xmlns=""
en el nodo raíz que está causando el problema. Esto significa que deberá registrar el espacio de nombres y luego usar un QName para referirse a los elementos.
$feed = simplexml_load_file(''http://www.sitepoint.com/recent.rdf'');
$feed->registerXPathNamespace("a", "http://www.domain.com/schema/data");
$result = $feed->xpath("a:Data/a:Something/...");
Importante : El URI utilizado en la llamada registerXPathNamespace
debe ser idéntico al que se usa en el archivo XML real.