A strange thing happened after a supplier changed the XML header a bit. I used to be able to read stuff using xpath, but now I can’t even get a reply with
$xml->xpath('/');
They changed it from this…
<?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> ...
to this:
<?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' > ...
Most likely this is because they’ve introduced a default namespace (
xmlns='http://iptc.org/std/NewsML/2003-10-10/') into their document. SimpleXML’s support for default namespaces is not very good, to put it mildly.Can you try to explicitly register a namespace prefix:
You would have to adapt your XPath expressions to use the
'n:'prefix on every element. Here is some additional info: http://people.ischool.berkeley.edu/~felix/xml/php-and-xmlns.html.EDIT: As per the spec:
This means it would have to be called before every XPath query, thus a function to wrap XPath queries would be the natural thing to do:
Usage: