Devius: DOM XML-Problem

Hallo Forianer,

ich habe ein kleines Problem. Und zwar habe ich eine XML-Datei, die so aussieht:

<?xml version="1.0"?>  
<!DOCTYPE page [  
<!ENTITY % ISOlat1 PUBLIC "-//W3C//ENTITIES Latin1 for XHTML//EN"  
"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">  
%ISOlat1;  
<!ENTITY % ISOsymbol PUBLIC "-//W3C//ENTITIES Symbols for XHTML//EN"  
"http://www.w3.org/TR/xhtml1/DTD/xhtml-symbol.ent">  
%ISOsymbol;  
<!ENTITY % ISOspecial PUBLIC "-//W3C//ENTITIES Special for XHTML//EN"  
"http://www.w3.org/TR/xhtml1/DTD/xhtml-special.ent">  
%ISOspecial;  
]>  
<files>  
 <file>  
  <title>Mein Titel</title>  
  <filename>en/index.html</filename>  
  <description/>  
  <keywords />  
  <image_path />  
  <style_path />  
  <style_screen />  
  <style_ie6 />  
  <style_ie7 />  
  <style_print />  
 </file>  
</files>  

Jetzt will ich den Eintrag löschen. Dafür habe ich folgende Funktion:

$doc = DOMDocument::load(../xml/source_en.xml);  
$xp = new DOMXPath($doc);  
$nodeList = $xp->query("file[filename=en/index.html]");  
$nodeList->item(0)->parentNode->removeChild($nodeList->item(0));  
$doc->save($file);  

Leider kommt beim Aufrufen immer die Fehlermeldung
"Call to a member function removeChild() on a non-object"

Wo liegt mein Denkfehler???

Auf Wiederlesen
     Devius

  1. Hi,

    Jetzt will ich den Eintrag löschen. Dafür habe ich folgende Funktion:

    $doc = DOMDocument::load(../xml/source_en.xml);

    $xp = new DOMXPath($doc);
    $nodeList = $xp->query("file[filename=en/index.html]");
    $nodeList->item(0)->parentNode->removeChild($nodeList->item(0));
    $doc->save($file);

    
    >   
    > Leider kommt beim Aufrufen immer die Fehlermeldung  
    > "Call to a member function removeChild() on a non-object"  
    >   
    > Wo liegt mein Denkfehler???  
      
    Darin, dass du meinst auf uebliche Debug-Masznahmen vollkommen verzichten zu koennen?  
      
    Hast du dir bspw. mal den Inhalt von $nodeList per var\_dump() ausgeben lassen?  
      
    MfG ChrisB  
      
    
    -- 
    „This is the author's opinion, not necessarily that of Starbucks.“
    
    1. Hallo ChrisB,

      Hast du dir bspw. mal den Inhalt von $nodeList per var_dump() ausgeben lassen?

      Hab ich, leider kann ich mit "object(DOMNodeList)#3 (0) { } " relativ wenig anfangen...

      Auf Wiederlesen
          Devius

      1. Hi,

        Hast du dir bspw. mal den Inhalt von $nodeList per var_dump() ausgeben lassen?

        Hab ich, leider kann ich mit "object(DOMNodeList)#3 (0) { } " relativ wenig anfangen...

        Na zumindest sollte dir daran doch wohl auffallen, dass diese DOMNodeList auffallend leer aussieht, oder?

        Dass von "keinen" Items das "erste" anzusprechen in Folge schief geht, sollte auch logisch sein.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Hallo ChrisB,

          Na zumindest sollte dir daran doch wohl auffallen, dass diese DOMNodeList auffallend leer aussieht, oder?

          das war mir schon aufgefallen...

          Dass von "keinen" Items das "erste" anzusprechen in Folge schief geht, sollte auch logisch sein.

          *grins*

          Was ich gerade ausprobiert habe, ist irgendwie interessant: Lade ich die Datei mit DOM ($doc = DOMDocument::load($file);), dann ist var_dump($doc); leer. Benutze ich aber SimpleXML ($xml = simplexml_load_file($file);), dann spuckt var_dump($xml); die XML-Datei aus... *grumpf*

          Ist vielleicht in dem geposteten XML ein Problem, so dass es PHP zwar mit SimpleXML aber nicht mit DOM einlesen kann?

          Auf Wiederlesen
              Devius

  2. Hallo,

    $nodeList = $xp->query("file[filename=en/index.html]");

    Der korrekte XPath-Ausdruck für Dich wäre:

    file[filename='en/index.html']

    Viele Grüße,
    Christian

    1. Hallo Christian,

      Der korrekte XPath-Ausdruck für Dich wäre:

      file[filename='en/index.html']

      Danke! Das zählt für mich wieder einmal zu der Kategorie: "Wegen zuviel hinsehen übersehen..."

      Auf Wiederlesen
          Devius