Simple XML / PHP

P.Hoffmann

Neuer User
Mitglied seit
1 Feb 2009
Beiträge
179
Punkte für Reaktionen
0
Punkte
0
Hallo,

wir nutzen seit wenigen Tagen PHP mit Simple XML für eine Anwendung. Dabei soll XML-Code generiert werden:

Code:
$test = new SimpleXMLElement("<test></test");

$test->addChild("test1", "wert1");
$test->addChild("test2", "wert2");
$test->addChild("test3", "");

echo $test->asXML();

Ausgabe:

Code:
<?xml version="1.0"?>
<test>
<test1>wert1</test1>
<test2>wert2</test2>
<test3></test3>
</test>

Richtig wäre jedoch:

Code:
<test3/>

... weil <test3> keinen Inhalt enthält. Hat jemand einen Tipp?

Viele Grüße,
Philipp
 
Das ist valides XML, wenn ein Knoten leer ist, dann kann er entweder voll ausgeschrieben werden mit <t></t> oder als verkürzte schreibweise mit <t/>, das erstere ist ein explizit geschlossenes Tag, das zweite ein selbstschließendes.
Das ganze hängt an der Implementierung deiner Library, der Entwickler hat da freie Hand, weil beides syntaktisch korrekt ist
 
Gibt es denn bei Simple XML eine Möglichkeit, auf "selbstschließend" umzustellen? Habe in der Dokumentation leider nichts dazu gefunden ...
 
Hallo,
Richtig wäre jedoch:

Code:
<test3/>

... weil <test3> keinen Inhalt enthält. Hat jemand einen Tipp?

Hi,

ja, wenn du nichts, anstelle eines leeren Strings übergibt, dann erhälst du ein selbstschliessendes Tag.

Code:
$test = new SimpleXMLElement("<test/>");

$test->addChild("test1", "wert1");
$test->addChild("test2", "wert2");
$test->addChild("test3");
// - $test->addChild("test3", "");
echo $test->asXML();


/*
<?xml version="1.0"?>
<test><test1>wert1</test1><test2>wert2</test2><test3/></test>
*/
 
Danke für die Antwort.

Die Daten werden jedoch aus einer Datenbank gelesen, und so z.B. direkt eingefügt:

$test->addChild("spalte1", $zeile["spalte1"]);

Da es recht viele Spalten sind, wäre eine if-Abfrage mit empty() sehr aufwendig.

Gibt es keine Möglichkeit dieses automatisch zu erkennen?
 
Gibt es keine Möglichkeit dieses automatisch zu erkennen?

So weit ich weiss nicht,
die Option LIBXML_NOEMPTYTAG oder LIBXML_NOBLANKS sind noch nicht vollständig portiert, aber es gibt ja ua. wegen diesen Eigenheiten Libs wie FluentDOM.

Da es recht viele Spalten sind, wäre eine if-Abfrage mit empty() sehr aufwendig.

wenn du aber diese Anforderung hast - etwas billiger als ein Funktionsaufruf oder if ist es so:

Code:
($value == "") && $value = NULL;
$test->addChild("test3", $value);

Und interessant ist, dass es auch als selbstschliessendes Element geladen wird:

Code:
$test = new SimpleXMLElement("<test/>");
$test->addChild("test1", "wert1");
$value = "wert";
$test->addChild("test2", $value);
$value = "";
// ($value == "") && $value = NULL;
$test->addChild("test3", $value);
$xmlData = $test->asXML();
echo $xmlData;

$xml = simplexml_load_string($xmlData);
echo $xml->asXml();
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.