Pregunta

Una cosa extraña sucedió después de un proveedor cambiado el encabezado XML un poco.Yo solía ser capaz de leer cosas usando xpath, pero ahora ni siquiera puedo obtener una respuesta con

$xml->xpath('/');

Que cambió a partir de este...

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE NewsML SYSTEM "http://www.newsml.org/dl.php?fn=NewsML/1.2/specification/NewsML_1.2.dtd" [
<!ENTITY % nitf SYSTEM "http://www.nitf.org/IPTC/NITF/3.4/specification/dtd/nitf-3-4.dtd">
%nitf;
]>
<NewsML>
...

a este:

<?xml version="1.0" encoding="iso-8859-1"?>
<NewsML
  xmlns="http://iptc.org/std/NewsML/2003-10-10/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://iptc.org/std/NewsML/2003-10-10/ http://www.iptc.org/std/NewsML/1.2/specification/NewsML_1.2.xsd http://iptc.org/std/NITF/2006-10-18/   http://contentdienst.pressetext.com/misc/nitf-3-4.xsd"
>
...
¿Fue útil?

Solución

Probablemente esto es debido a que he introducido un espacio de nombres predeterminado (xmlns="http://iptc.org/std/NewsML/2003-10-10/") en su documento.SimpleXML del soporte para espacios de nombres por defecto no es muy buena que digamos.

Puedes intentar registrar explícitamente un prefijo de espacio de nombres:

$xml->registerXPathNamespace("n", "http://iptc.org/std/NewsML/2003-10-10/");
$xml->xpath('/n:NewsML');

Usted tendría que adaptar sus expresiones XPath para el uso de la "n:" prefijo cada elemento.Aquí hay alguna información adicional: http://people.ischool.berkeley.edu/~felix/xml/php-and-xmlns.html.

EDITAR:Como por la especificación:

El registerXPathNamespace() la función crea un prefijo/ns contexto para la próxima consulta XPath.

Esto significa que habría de ser llamado antes de cada consulta de XPath, por lo tanto una función de envolver consultas XPath sería lo más natural:

function simplexml_xpath_ns($element, $xpath, $xmlns)
{
    foreach ($xmlns as $prefix_uri)
    {
        list($prefix, $uri) = explode("=", $prefix_uri, 2);
        $element->registerXPathNamespace($prefix, $uri);
    }
    return $element->xpath($xpath);
}

Uso:

$xmlns = ["n=http://iptc.org/std/NewsML/2003-10-10/"];
$result = simplexml_xpath_ns($xml, '/n:NewsML', $xmlns);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top