Verwenden von SimpleXML zum Erstellen eines XML-Objekts von Grund auf neu


76

Ist es möglich, mit den SimpleXML-Funktionen von PHP ein XML-Objekt von Grund auf neu zu erstellen? Wenn Sie die Funktionsliste durchsehen, gibt es Möglichkeiten, eine vorhandene XML-Zeichenfolge in ein Objekt zu importieren, das Sie dann bearbeiten können. Wenn ich jedoch ein XML-Objekt nur programmgesteuert von Grund auf neu generieren möchte, wie geht das am besten?

Ich habe herausgefunden, dass Sie simplexml_load_string () verwenden und die gewünschte Root-Zeichenfolge übergeben können, und dann haben Sie ein Objekt, das Sie durch Hinzufügen von Kindern manipulieren können ... obwohl dies wie ein Hack erscheint, da ich muss Codieren Sie tatsächlich etwas XML in die Zeichenfolge, bevor es geladen werden kann.

Ich habe es mit den DOMDocument-Funktionen gemacht , obwohl es etwas verwirrend ist, weil ich nicht sicher bin, was das DOM mit dem Erstellen eines reinen XML-Dokuments zu tun hat ... also ist es vielleicht nur schlecht benannt :-)

Antworten:


143

Sicher kannst du. Z.B.

<?php
$newsXML = new SimpleXMLElement("<news></news>");
$newsXML->addAttribute('newsPagePrefix', 'value goes here');
$newsIntro = $newsXML->addChild('content');
$newsIntro->addAttribute('type', 'latest');
Header('Content-type: text/xml');
echo $newsXML->asXML();
?>

Ausgabe

<?xml version="1.0"?>
<news newsPagePrefix="value goes here">
    <content type="latest"/>
</news>

Habe Spaß.


Zwischen dieser und den Antworten von @ Stefan und @ PhiLho scheint dies die einfachste und direkteste zu sein. Gleichzeitig frage ich mich, ob die Leistung unterschiedlich ist. Die anderen beiden riechen nach schnellem Code.
Camilo Martin

2
Wie speichere ich dies als XML-Datei auf dem Server? um es meinem Actionscript-Code zur Verfügung zu stellen?
Shababhsiddique

@dreamwerx Vielleicht fehlt mir etwas, warum ist dein contentTag nicht geschlossen </content>?
Shackrock

1
@Shackrock: es ist geschlossen, schauen Sie sich das "/" vor dem ">" von <content type = "latest" /> an
Michel

4
So fügen Sie Text zwischen Inhalts-Tags hinzu. Sagen Sie <Inhalt> Wow, es funktioniert! </ content>
Harishannam

21

In PHP5 sollten Sie stattdessen die Klasse Document Object Model verwenden. Beispiel:

$domDoc = new DOMDocument;
$rootElt = $domDoc->createElement('root');
$rootNode = $domDoc->appendChild($rootElt);

$subElt = $domDoc->createElement('foo');
$attr = $domDoc->createAttribute('ah');
$attrVal = $domDoc->createTextNode('OK');
$attr->appendChild($attrVal);
$subElt->appendChild($attr);
$subNode = $rootNode->appendChild($subElt);

$textNode = $domDoc->createTextNode('Wow, it works!');
$subNode->appendChild($textNode);

echo htmlentities($domDoc->saveXML());

1
DOM API ist so ausführlich! Ich würde gerne in der Lage sein, so etwas wie das $elem->append($doc->p('This is a paragraph')); Anhängen von Text ist eine zweizeilige Aufgabe. Ich würde so etwas lieben$elem->append('Some text');
Thomasrutter

2
Meiner Meinung nach hängt es sehr davon ab, was Sie vorhaben. Wenn Sie grundlegende und schnelle Funktionen wünschen, ist SimpleXML perfekt! Aber wie auch immer: Die Frage lautete "Verwenden von SimpleXML zum Erstellen eines XML-Objekts von Grund auf neu" - also nicht zum Thema, sorry.
Stephan Weinhold

16

Bitte sehen Sie meine Antwort hier . Wie dreamwerx.myopenid.com hervorhebt , ist dies mit SimpleXML möglich , aber die DOM-Erweiterung wäre der bessere und flexiblere Weg. Zusätzlich gibt es einen dritten Weg: die Verwendung von XMLWriter . Es ist viel einfacher zu bedienen als das DOM und daher meine bevorzugte Methode, XML-Dokumente von Grund auf neu zu schreiben.

$w=new XMLWriter();
$w->openMemory();
$w->startDocument('1.0','UTF-8');
$w->startElement("root");
    $w->writeAttribute("ah", "OK");
    $w->text('Wow, it works!');
$w->endElement();
echo htmlentities($w->outputMemory(true));

Übrigens: DOM steht für D ocument O bject M odel; Dies ist die standardisierte API für XML-Dokumente.


XMLwriter ist gut, wenn Sie beabsichtigen, ohne Manipulation direkt in XML-Code auszugeben. Eine weitere Manipulation (Bewegen von Elementen, Einfügen von Elementen) ist nicht wirklich möglich.
Thomasrutter

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.