php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > XML
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


XML Hier passt alles rein, was das Thema XML (XSLT, JSON etc...) betrifft, auch in Verbindung mit PHP

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 2 Stimmen, 3,00 durchschnittlich.
  #1 (permalink)  
Alt 10-03-2010, 18:09
twietee
 Registrierter Benutzer
Links : Onlinestatus : twietee ist offline
Registriert seit: Mar 2010
Beiträge: 7
twietee befindet sich auf einem aufstrebenden Ast
Exclamation 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 funktionierts -->
    
    
$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

Geändert von twietee (10-03-2010 um 23:07 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 10-03-2010, 18:31
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (10-03-2010 um 18:36 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 10-03-2010, 23:14
twietee
 Registrierter Benutzer
Links : Onlinestatus : twietee ist offline
Registriert seit: Mar 2010
Beiträge: 7
twietee befindet sich auf einem aufstrebenden Ast
Standard

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...
Mit Zitat antworten
  #4 (permalink)  
Alt 10-03-2010, 23:25
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
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.
Mit Zitat antworten
  #5 (permalink)  
Alt 10-03-2010, 23:44
twietee
 Registrierter Benutzer
Links : Onlinestatus : twietee ist offline
Registriert seit: Mar 2010
Beiträge: 7
twietee befindet sich auf einem aufstrebenden Ast
Standard

...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

Geändert von twietee (11-03-2010 um 09:07 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 10-03-2010, 23:52
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #7 (permalink)  
Alt 11-03-2010, 09:22
twietee
 Registrierter Benutzer
Links : Onlinestatus : twietee ist offline
Registriert seit: Mar 2010
Beiträge: 7
twietee befindet sich auf einem aufstrebenden Ast
Question

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...

Geändert von twietee (11-03-2010 um 09:37 Uhr)
Mit Zitat antworten
  #8 (permalink)  
Alt 11-03-2010, 09:35
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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:
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.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (11-03-2010 um 09:46 Uhr)
Mit Zitat antworten
  #9 (permalink)  
Alt 11-03-2010, 11:23
twietee
 Registrierter Benutzer
Links : Onlinestatus : twietee ist offline
Registriert seit: Mar 2010
Beiträge: 7
twietee befindet sich auf einem aufstrebenden Ast
Standard

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:
$xml->entry[$i]->group

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
Mit Zitat antworten
  #10 (permalink)  
Alt 11-03-2010, 11:34
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
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]->group->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:
Zitat von twietee Beitrag anzeigen
Da versuche ich doch, erst "media:group" zu erzeugen...
Das klappt ja sicherlich auch, wie übrigens bereits gesagt.

Zitat:
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:
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.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!

Geändert von AmicaNoctis (11-03-2010 um 11:49 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 11-03-2010, 12:48
twietee
 Registrierter Benutzer
Links : Onlinestatus : twietee ist offline
Registriert seit: Mar 2010
Beiträge: 7
twietee befindet sich auf einem aufstrebenden Ast
Lightbulb

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

Geändert von twietee (11-03-2010 um 12:59 Uhr) Grund: Anonymisierung des Codes :-)
Mit Zitat antworten
  #12 (permalink)  
Alt 11-03-2010, 12:58
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

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
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #13 (permalink)  
Alt 11-03-2010, 13:06
twietee
 Registrierter Benutzer
Links : Onlinestatus : twietee ist offline
Registriert seit: Mar 2010
Beiträge: 7
twietee befindet sich auf einem aufstrebenden Ast
Cool

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
Mit Zitat antworten
  #14 (permalink)  
Alt 11-03-2010, 13:10
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von twietee Beitrag anzeigen
Eine komplette Codezeile hätte aber die Verwirrung mindern können.
Du sollst es ja verstehen und nicht kopieren
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
namespaces, simplexml


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Namespaces und Autoloading Griecherus BRAINSTORMING PHP/SQL/HTML/JS/CSS 16 26-05-2008 21:46
simplexml jens2 XML 9 28-03-2008 12:49
SimpleXML rlebek XML 6 09-08-2007 11:49
namespaces und SimpleXML add... justcode XML 0 28-07-2006 13:13
SimpleXML Marcusson PHP Developer Forum 4 25-07-2006 13:17

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 08:56 Uhr.