Re: Simple XML, (x)html, and xpath
| From: | Andrew Ballard | Date: | Fri, 25 May 2012 14:25:54 +0000 |
| Subject: | Re: Simple XML, (x)html, and xpath | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-317999@lists.php.net to get a copy of this message | ||
On Fri, May 25, 2012 at 3:57 AM, Gary <listgj-phpgeneral@yahoo.co.uk> wrote:
> If I use simplexml_load_string to create an XML object with the
> following XHTML
> ,----
> | <?xml version="1.0"?>
> | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
> | "http://www.w3.org/TR/
> | xhtml1/DTD/xhtml1-strict.dtd">
> | <html xmlns="http://www.w3.org/1999/xhtml">
> | <head><meta http-equiv="Content-Type" content="text/html;
> charset=UTF-8"
> | />
> | <title>test title</title>
> | </head>
> | <body>
> | <!-- comment -->
> | </body>
> | </html>
> `----
>
> I get this SimpleXMLElement back
> ,----
> | object(SimpleXMLElement)#1 (2) {
> | ["head"]=>
> | object(SimpleXMLElement)#2 (1) {
> | ["title"]=>
> | string(10) "test title"
> | }
> | ["body"]=>
> | object(SimpleXMLElement)#3 (1) {
> | ["comment"]=>
> | object(SimpleXMLElement)#4 (0) {
> | }
> | }
> | }
> `----
>
> but I cannot seem to get anything out of an xpath expression, no matter
> what I try.
>
> If, however, I remove the
> 'xmlns="http://www.w3.org/1999/xhtml"' in the
> html element, it works fine. So yeah, I can just remove that text,
> but... is there something wrong here, in my expectation or in the xpath
> function?
>
> TIA.
>
> --
> Gary Please do NOT send me 'courtesy' replies off-list.
Gary,
I am not sure what you have tried, but namespaces change everything in
XPath compared to documents without them. This isn't exact, but XPath
without namespaces is often simple such as:
/html/head/title
Once you add a namespace, though, the XPath becomes something like
/*[namespace-uri()='http://www.w3.org/1999/xhtml' and
local-name()='html']/*[namespace-uri()='http://www.w3.org/1999/xhtml'
and local-name()='head']/*[namespace-uri()='http://www.w3.org/1999/xhtml'
and local-name()='title']
(I'm not sure of the exact syntax since I don't have something open
right now that I can test it in.
However, I think SimpleXML has some features that make this easier.
Take a look at this:
http://www.php.net/manual/en/simplexmlelement.registerxpathnamespace.php
Andrew