2010-12-28 15 views
1

Ich kann nicht scheinen, dass PHPs SimpleXML-Klasse vorgefertigte Namespace-Elemente in einem XHTML-Dokument erkennt. Hier ist mein Beispiel:SimpleXML kann Namespaced-Elemente nicht finden

test.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:zuq="http://localhost/zuq"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
</head> 

<body> 
    <h1>Heading</h1> 
    <p>Paragraph</p> 
    <zuq:region name="myRegion"> 
     <div class="myClass"> 
      <h1><zuq:data name="myDataHeading" /></h1> 
      <p><zuq:data name="myDataParagraph" /></p> 
     </div> 
    </zuq:region> 
</body> 
</html> 

Wenn ich Folgendes tun:

$sxml = simplexml_load_file('test.html'); 
print_r($sxml); 

Es gibt:

SimpleXMLElement Object 
(
    [head] => SimpleXMLElement Object 
     (
      [meta] => SimpleXMLElement Object 
       (
        [@attributes] => Array 
         (
          [http-equiv] => Content-Type 
          [content] => text/html; charset=utf-8 
         ) 

       ) 

      [title] => Untitled Document 
     ) 

    [body] => SimpleXMLElement Object 
     (
      [h1] => Heading 
      [p] => Paragraph 
     ) 

) 

Aber wenn ich folgendes tun:

$sxml = simplexml_load_file('test.html'); 
$sxml_zuq = $sxml->children('zuq', true); 
print_r($sxml_zuq); 

Es gibt leer:

SimpleXMLElement Object 
(
) 

Iterieren durch das Objekt mit foreach oder sonst scheint nicht zu funktionieren, und die URI anstatt das Präfix in children() schlägt ebenfalls fehl.

Ich habe offensichtlich irgendwo einen Fehler gemacht, aber ich bin mir nicht sicher, wo, wie mein Versuch ist ziemlich identisch mit vielen Tutorial-Beispielen, die ich in meiner Lesung gestoßen bin.

Was geht hier vor?

+0

angegeben Wenn Sie 'SimpleXMLElement :: getNamespaces()' verwenden erhalten Sie ein Ergebnis? –

+0

Ja ich tue ** John Giotta **; Wie Josh jedoch betonte, Kinder sind nur direkte Nachkommen. – Dan

Antwort

2

children() gibt Ihnen nur die [direkten] untergeordneten Elemente des Kontextknotens, keine Nachkommen.

$html = simplexml_load_file('test.html'); 

// get <body/>'s children 
$html->body->children('zuq', true); 

// use XPath to get all zuq:* nodes 
$html->xpath('//zuq:*'); 
+0

** Josh Davis ** rettet den Tag :) – Dan

0

Just for Info, falls die Namespace-Definition, xmlns: Zūq = "http: // localhost/Zūq" wurde in dem eigentlichen XML-Elemente anstelle von Wurzelknoten deklariert, dann müssen wir rufen zusätzlich registerXPathNamespace Funktion und dann xpath verwenden, wie in http://www.dimuthu.org/blog/2008/09/30/xpath-in-simplexml/