Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
SimpleXML und Namespaces, _schreibend_ [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
ebiz-consult PHP Entwicklung
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
SimpleXML und Namespaces, _schreibend_


 
twietee
10-03-2010, 19:09 
 
Hallo und guten Tag!

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


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


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


$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. :dontknow:

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

 
AmicaNoctis
10-03-2010, 19:31 
 
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

 
twietee
11-03-2010, 00:14 
 
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...

 
wahsaga
11-03-2010, 00:25 
 
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.

 
twietee
11-03-2010, 00:44 
 
...meinst du den hier:


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

 
AmicaNoctis
11-03-2010, 00:52 
 
Also, zunächst mal solltest du mit dem SimpleXMLElement-Konstruktor arbeiten und den Default Namespace angeben:

$xml = new SimpleXMLElement($XMLfile, null, true, "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 $xml->entry[$i]->group funktioniert nicht, weil das group-Element zum media-Namspace gehört. Stattdessen würde es mit

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

Gruß,

Amica

 
twietee
11-03-2010, 10:22 
 
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

$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
<media:group> Element erzeugen, welches dann andere "media:..."-Elemente enthält... :confused:

 
AmicaNoctis
11-03-2010, 10:35 
 
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:
Ich will ja ein
<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.

 
twietee
11-03-2010, 12:23 
 
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?!

$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

 
AmicaNoctis
11-03-2010, 12:34 
 
Wann hab ich das denn versucht?!

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

Da versuche ich doch, erst "media:group" zu erzeugen...

Das klappt ja sicherlich auch, wie übrigens bereits gesagt.

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:

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 (http://www.php-resource.de/forum/xml/99046-simplexml-und-namespaces-_schreibend_.html#post636673) 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.

 
twietee
11-03-2010, 13:48 
 
Auweia! ^^

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

Mit:

$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:

error_reporting(E_ALL);
ini_set('display_errors', 1); ...klappt natürlich auch das.

Hab noch soooo viel zu lernen. :)

:danke: für die Hilfe,

Gruss,
T

 
AmicaNoctis
11-03-2010, 13:58 
 
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 (http://www.php-resource.de/forum/xml/99046-simplexml-und-namespaces-_schreibend_.html#post636683). Das solltest du in Foren als Hilfesuchender vielleicht generell vermeiden.

Gruß,

Amica

 
twietee
11-03-2010, 14:06 
 
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

 
AmicaNoctis
11-03-2010, 14:10 
 
Eine komplette Codezeile hätte aber die Verwirrung mindern können.

Du sollst es ja verstehen und nicht kopieren ;)


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:03 Uhr.