SimpleXML und Namespaces, _schreibend_

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SimpleXML und Namespaces, _schreibend_

    Hallo und guten Tag!

    Auch ich hab so meine Problemchen mit SimpleXML. Genauer gesagt nur eins: das Schreiben von Namespaces-enthaltenden Elementen der Art:

    Code:
        ...
        <media:group>
                <media:credit role="author" ... ></media:credit>
                ...
        </media:group>
        ...
    Hier mal ein XML-Auszug, wie gesagt, einlesen klappt, ausgeben von Elementen mit Namespaces nicht...

    HTML-Code:
    <?xml version="1.0"?>
    <feed
        xmlns="http://www.w3.org/2005/Atom"
        xmlns:media="http://search.yahoo.com/mrss/>
     
        <entry>
            <title>some title</title>
            <link rel="alternate" href="#"/>
            <summary>This is a ...</summary>
            <media:group>
                <media:credit role="author">some author...</media:credit>
                <media:content url="../video/video1.mp4" type="video/mp4"/>
                <media:thumbnail url="http://www.example.com/preview1.jpg"/>
            </media:group>   
        </entry>
        ...
    Hier mein PHP-Code...

    PHP-Code:
        $xml simplexml_load_file($XMLfile);

        <!-- ... 
    bisschen Code ... -->

        
    $newEntry $xml->addChild("entry");
        
    $newEntry ->addChild("title"htmlspecialchars(utf8_encode($title)));

        
    $link     $xml->entry[$i]->addChild("link");
        
    $link     ->addAttribute("rel""alternate");
        
    $link     ->addAttribute("href""#");
                           
        
    $newEntry ->addChild("summary"htmlspecialchars(utf8_encode($summary)));
        
        <!-- 
    bis hierher funktioniert's -->
        
        $mediaGroup = $xml->entry[$i]->addChild("media:group", NULL, "http://search.yahoo.com/mrss/");

        $mediaCredit = $xml->entry[$i]->group->addChild("media:credit", "GTV - The German Media Experts.", 
                             "http://search.yahoo.com/mrss/");
        $mediaCredit ->addAttribute("role", "author");
                           
        $mediaContent = $xml->entry[$i]->group->addChild("media:content", NULL, "http://search.yahoo.com
                                /mrss/");
        $mediaContent ->addAttribute("url", "../video/" . htmlspecialchars(utf8_encode($video_name)));
        $mediaContent ->addAttribute("type", "video/x-flv");
                           
        $mediaThumbnail = $xml->entry[$i]->group->addChild("media:thumbnail", NULL, "http://search.yahoo.com
                                  /mrss/");
        $mediaThumbnail ->addAttribute("url", "../video/" . htmlspecialchars(utf8_encode($preview_name)));
                           
        $xml->asXML($XMLfile); 
    ...Probleme gibt's wie halt ab dem <:media - Zeugs, habe da schon allerhand ausprobiert, aber meine Ziel-Ausgabe (siehe XML-Code) erreiche ich nicht. Beim momentanen Code wird vor der Ausgabe der <:media Elemente abgebrochen.

    Die Dokumentationslage für mein Problem (SimpleXML + Namespaces) sieht leider ziemlich schlecht aus -- ich bin bisher auf 2 Ansätze gestossen, beide haben mir aber nicht geholfen.

    Hoffe das war nicht zu viel und ich hab nix vergessen. Freue mich auf Vorschläge!

    Gruss,
    T
    Zuletzt geändert von twietee; 10.03.2010, 23:07.

  • #2
    Hallo,

    wie der Name schon sagt, ist SimpleXML für einfache XML-Dokumente gedacht, wenn du mit namespaced Dokumenten hantierst, ist DOM die richtige Wahl. (Um Missverständnissen vorzubeugen: Es würde zwar auch mit SimpleXML gehen, aber wenn Namespaces ins Spiel kommen ist es damit sogar noch komplizierter als über das DOM.)

    Gruß,

    Amica
    Zuletzt geändert von AmicaNoctis; 10.03.2010, 18:36.
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hi,

      Ich hatte "SimpleXML" ja so verstanden, dass es damit besonders einfach ist, XML Daten zu bearbeiten...

      Wenn das, was ich umsetzen möchte, in SimpleXML möglich ist, kannst du mir dann bitte einen Hinweis geben, wie ich das umsetzen kann?

      Ich schau mir auch mal die DOM-Variante an, aber nun bin ich ja soooo kurz vorm Ziel, da würd ich schon gern wissen, wie's geht.

      Danke für die Antwort.

      Gruss,
      T

      P.S. Hab den Code ein bisschen umgebrochen, im Editor wird aber leider nicht angezeigt, wie viele Zeichen eine Zeile hat...

      Kommentar


      • #4
        Zitat von twietee Beitrag anzeigen
        Wenn das, was ich umsetzen möchte, in SimpleXML möglich ist, kannst du mir dann bitte einen Hinweis geben, wie ich das umsetzen kann?
        Die Nutzerkommentare im Manual lesen.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          ...meinst du den hier:

          PHP-Code:
          If you want to add a child element that is prefixed by a namespace like 
          this one: 
           
          <content:encoded> 
           
          then this is what you need to do: 
           
          <?php 
              $parent
          ->addChild('content:encoded''some actual content here'''http://purl.org/rss/1.0/modules/
                  
          content/''); 
          ?> 
           
          Make sure you declared the namespace at some parent element, preferrably at root: 

          <root xmlns:content="http://purl.org/rss/1.0/modules/content/"> 
           
          This will create a child element that will look like this when object dumpted as xml string: 

          <content:encoded> 
           
          If you are adding child this way:  
           
          <?php 
              $parent
          ->addChild('encoded''some actual content here'''content''); 
          ?> 
           
          then your child element will look like this: 
          <encoded xmlns="content"> 

          which is also a valid xml tag and basically has the same exact value as <content:encoded> but just 
          looks different.
          Das ist einer von den 2 Ansätzen, die mir nicht geholfen haben. Oder hab ich da was übersehen... ?!

          Gruss
          T
          Zuletzt geändert von twietee; 11.03.2010, 09:07.

          Kommentar


          • #6
            Also, zunächst mal solltest du mit dem SimpleXMLElement-Konstruktor arbeiten und den Default Namespace angeben:

            PHP-Code:
            $xml = new SimpleXMLElement($XMLfilenulltrue"http://www.w3.org/2005/Atom"); 
            Dann musst du jedesmal den Namespace-Wechsel beachten, indem du vorher die children-Methode mit der Namespace-URI aufrufst (ab PHP 5.2 auch mit dem Präfix und true als 2. Parameter möglich). Dein
            PHP-Code:
            $xml->entry[$i]->group 
            funktioniert nicht, weil das group-Element zum media-Namspace gehört. Stattdessen würde es mit

            PHP-Code:
            $xml->entry[$i]->children("http://search.yahoo.com/mrss/")->group 
            oder
            PHP-Code:
            $xml->entry[$i]->children("media"true)->group // ab PHP 5.2 
            funktionieren.

            Gruß,

            Amica
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Hi,

              vielen Dank nochmal für eure Hilfsbereitschaft!

              Mein Problem ist jedoch nicht, auf diese Elemente zuzugreifen, sondern sie zu erstellen...

              Demzufolge nützt mir doch
              PHP-Code:
                  $xml->entry[$i]->children("media"true)->group // ab PHP 5.2 
              garnix, weil das "media"-Element - im neuen "entry" - überhaupt nicht existiert, oder?!

              Wir sind sooo kurz vor der Lösung, nicht aufgeben, bitte!

              Danke + Gruss,
              T

              Edit:

              Ich will ja ein
              Code:
              <media:group>
              Element erzeugen, welches dann andere "media:..."-Elemente enthält...
              Zuletzt geändert von twietee; 11.03.2010, 09:37.

              Kommentar


              • #8
                Was dein Problem ist, habe ich verstanden, du wahrscheinlich aber nicht.

                Du kannst kein neues Element erstellen (group->addChild), wenn es das davor (group) gar nicht gibt. Deswegen ist dein Problem der Zugriff auf das media:group-Element.

                Von einem media-Element ist bei dem Aufruf der children-Methode auch nicht die Rede, sondern vom media-Namespace, der erstmal geöffnet werden muss. Ich sagte ja schon, dass SimpleXML etwas merkwürdig ist.

                Probier's halt aus und lies das Handbuch, wenn du mir nicht glaubst, aber es ist so.

                Edit:
                Zitat von twietee Beitrag anzeigen
                Ich will ja ein
                Code:
                <media:group>
                Element erzeugen
                ... was ja auch funktioniert, nur danach, wenn du diesem Element weitere Kinder hinzufügen willst, beachtest du den Namespace-Wechsel nicht.
                Zuletzt geändert von AmicaNoctis; 11.03.2010, 09:46.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Hallo Amica,

                  Ich weiß wirklich zu schätzen, dass du dir die Zeit nimmst, und versuchst, mir zu helfen.

                  Allerdings hab ich keinen Plan, was du meinst.

                  Du:
                  "Du kannst kein neues Element erstellen (group->addChild), wenn es das davor (group) gar nicht gibt. Deswegen ist dein Problem der Zugriff auf das media:group-Element."

                  Wann hab ich das denn versucht?!
                  PHP-Code:
                  $mediaGroup  $xml->entry[$i]->addChild("media:group"NULL"http://search.yahoo.com/mrss/");
                  $mediaCredit $xml->entry[$i]->group->addChild("media:credit""GTV - The German Media Experts."
                                           
                  "http://search.yahoo.com/mrss/"); 
                  Da versuche ich doch, erst "media:group" zu erzeugen und danach das Kindelement hinzuzufügen?!

                  Du:
                  "Dein PHP-Code:
                  [COLOR=#000000] [COLOR=#0000cc]$xml[/COLOR][COLOR=#006600]->[/COLOR][COLOR=#0000cc]entry[/COLOR][COLOR=#006600][[/COLOR][COLOR=#0000cc]$i[/COLOR][COLOR=#006600]]->[/COLOR][COLOR=#0000cc]group
                  [/COLOR] [/COLOR]

                  funktioniert nicht, weil das group-Element zum media-Namspace gehört."

                  Wo hab ich denn bitte dieses Statement zu stehen? Alleine garnicht, im ganzen Code aber mindestens 3x. Alleine hilft mir das leider wenig und verwirrt mich eher.

                  Ich habe die letzten 2 Tage das Manual gelesen, wie ich aber bereits erwähnt hab, sind Namespaces dort eher wenig behandelt und selbst der eine User-Kommentar diesbezüglich hilft mir leider nicht weiter.

                  Vielleicht kannst du eine / die spezielle Codezeile erwähnen, die ich ändern muss / in der was schief läuft?!

                  Danke nochmal und Gruss,
                  T

                  Kommentar


                  • #10
                    Zitat von twietee Beitrag anzeigen
                    Wann hab ich das denn versucht?!
                    Code:
                    $mediaGroup  = $xml->entry[$i]->addChild("media:group", NULL, "http://search.yahoo.com/mrss/");
                    $mediaCredit = $xml->entry[$i]->[B][COLOR="Red"]group[/COLOR][/B]->addChild("media:credit", "GTV - The German Media Experts.", 
                                             "http://search.yahoo.com/mrss/");
                    Dort wo ich es markiert hab. An der Stelle gibt es group nicht, weil es in einem anderen Namespace ist.

                    Zitat von twietee Beitrag anzeigen
                    Da versuche ich doch, erst "media:group" zu erzeugen...
                    Das klappt ja sicherlich auch, wie übrigens bereits gesagt.

                    Zitat von twietee Beitrag anzeigen
                    und danach das Kindelement hinzuzufügen?!
                    Was nicht geht, weil du es falsch machst. Dort ist der Namespace-Wechsel, das hab ich auch schon mehrmals erklärt.

                    EDIT:

                    Zitat von twietee Beitrag anzeigen
                    Wo hab ich denn bitte dieses Statement zu stehen? Alleine garnicht, im ganzen Code aber mindestens 3x.
                    Und das ist 3x falsch. Was ist so schwer daran, diese 3 Vorkommen durch das zu ersetzen, was ich dir in meiner zweiten Antwort geschrieben hab (das mit der children-Methode)?


                    Wenn du im Übrigen die Forenregeln gelesen und beachtet hättest, würde dir PHP auch sagen, an welcher Stelle du was falsch machst.
                    Zuletzt geändert von AmicaNoctis; 11.03.2010, 11:49.
                    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                    Super, danke!
                    [/COLOR]

                    Kommentar


                    • #11
                      Auweia! ^^

                      Muss mich entschuldigen, weiß auch nicht, was ich da angestellt hab... tststs.

                      Mit:
                      PHP-Code:
                      $newEntry         $xml->addChild("entry");
                      $newEntry        ->addChild("title"htmlspecialchars(utf8_encode($title)));
                                              
                      $link            $xml->entry[$i]->addChild("link");
                      $link            ->addAttribute("rel""alternate");
                      $link            ->addAttribute("href""#");
                                              
                      $newEntry        ->addChild("summary"htmlspecialchars(utf8_encode($summary)));
                                              
                      $mediaGroup     $xml->entry[$i]->addChild("media:group"NULL"http://search.yahoo.com/mrss/");

                      $mediaCredit     $xml->entry[$i]->children("media"true)->group->addChild("media:credit""Some credits..."
                                          
                      "http://search.yahoo.commrss/");
                      $mediaCredit     ->addAttribute("role""author");
                                                                 
                      $mediaContent     $xml->entry[$i]->children("media"true)->group->addChild("media:content"NULL
                                          
                      "http://search.yahoo.com/mrss/");
                      $mediaContent     ->addAttribute("url""../video/" htmlspecialchars(utf8_encode($video_name)));
                      $mediaContent     ->addAttribute("type""video/x-flv");
                                                                 
                      $mediaThumbnail    $xml->entry[$i]->children("media"true)->group->addChild("media:thumbnail"NULL
                                          
                      "http://search.yahoo.com/mrss/");
                      $mediaThumbnail    ->addAttribute("url""../video/" htmlspecialchars(utf8_encode($preview_name)));
                                                                 
                      $xml->asXML($XMLfile); 
                      ...funktioniert's jetzt.

                      Bezüglich der Fehlermeldungen hatte ich vorher gelesen, dass deren Aktivierung eine Servereinstellung ist, sorry. Mit:
                      PHP-Code:
                      error_reporting(E_ALL);
                      ini_set('display_errors'1); 
                      ...klappt natürlich auch das.

                      Hab noch soooo viel zu lernen.

                      für die Hilfe,

                      Gruss,
                      T
                      Zuletzt geändert von twietee; 11.03.2010, 12:59. Grund: Anonymisierung des Codes :-)

                      Kommentar


                      • #12
                        Kein Problem, ich reagiere nur immer etwas genervt, wenn ich die Lösung poste und dann jemand anfängt zu diskutieren, dass das ja nichts nützen würde und ich das Problem nicht verstanden hätte. Das solltest du in Foren als Hilfesuchender vielleicht generell vermeiden.

                        Gruß,

                        Amica
                        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                        Super, danke!
                        [/COLOR]

                        Kommentar


                        • #13
                          Ich hab einfach nicht gleich verstanden, was du meintest -- kann auch an meiner generellen Verwirrtheit bezüglich des Problems gelegen haben.

                          Eine komplette Codezeile hätte aber die Verwirrung mindern können.

                          Ich hoffe du hast dich nicht persönlich angegriffen gefühlt, das war nicht beabsichtigt!

                          Für zukünftige Posts gelobe ich aber Besserung!

                          Vielen Dank nochmal.
                          T

                          Kommentar


                          • #14
                            Zitat von twietee Beitrag anzeigen
                            Eine komplette Codezeile hätte aber die Verwirrung mindern können.
                            Du sollst es ja verstehen und nicht kopieren
                            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                            Super, danke!
                            [/COLOR]

                            Kommentar

                            Lädt...
                            X