Wenn ich rufeSimpleXML, wie ein Kind in einem Knoten voranzustellen?
addChild('actor', 'John Doe');
dieses Kind wird in der letzten hinzugefügt. Gibt es eine Möglichkeit, dieses neue Kind zum ersten Kind zu machen?
Wenn ich rufeSimpleXML, wie ein Kind in einem Knoten voranzustellen?
addChild('actor', 'John Doe');
dieses Kind wird in der letzten hinzugefügt. Gibt es eine Möglichkeit, dieses neue Kind zum ersten Kind zu machen?
Wie es erwähnt wurde, ist SimpleXML nicht unterstützen, so dass Sie DOM verwenden müssten. Hier ist, was ich empfehle: Erweitern Sie SimpleXMLElement mit allem, was Sie in Ihren Programmen benötigen. Auf diese Weise können Sie die gesamte DOM-Manipulation und andere XML-Magie außerhalb Ihres eigentlichen Programms behalten. Indem Sie die beiden Dinge getrennt halten, verbessern Sie die Lesbarkeit und Wartbarkeit.
Hier ist, wie SimpleXMLElement mit einer neuen Methode prependChild erweitern():
class my_node extends SimpleXMLElement
{
public function prependChild($name, $value)
{
$dom = dom_import_simplexml($this);
$new = $dom->insertBefore(
$dom->ownerDocument->createElement($name, $value),
$dom->firstChild
);
return simplexml_import_dom($new, get_class($this));
}
}
$actors = simplexml_load_string(
'<actors>
<actor>Al Pacino</actor>
<actor>Zsa Zsa Gabor</actor>
</actors>',
'my_node'
);
$actors->addChild('actor', 'John Doe - last');
$actors->prependChild('actor', 'John Doe - first');
die($actors->asXML());
Es sieht nicht so aus SimpleXML dass unterstützt tun, so haben Sie zwei Möglichkeiten:
Verwenden Sie das DOM-Modul statt (oder einer der anderen XML-Module, wahrscheinlich), und verwenden Sie die DOMNode::insertBefore method, oder
Erstellen Sie ein neues SimpleXMLElement, kopieren Sie die Attribute, fügen Sie dann Ihren neuen Knoten hinzu, fügen Sie danach alle untergeordneten Elemente des ursprünglichen Knotens hinzu, und ersetzen Sie dann das Original durch das neue.
Update: Nach etwas mehr der Dokumentation der Suche durch, ich so etwas wie das würde vorschlagen, folgende (vorausgesetzt, Sie noch mit SimpleXML zum größten Teil bleiben wünscht, andernfalls nur DOM verwenden, um direkt für alles):
$dom_elem = dom_import_simplexml($simple_xml_element);
$dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild);
ich bereits zweiten Ansatz bin. Aber es sah hässlich aus und dachte an bessere Alternativen. – understack
Vorausgesetzt, dass Sie die Funktion nutzen können insert_before Sie die folgende Funktion verwenden:
Funktion prependChild (Eltern, node) { parent.insertBefore (node, parent.firstChild); }
Quellverweis: XML Matters: Beyond the DOM
+1 für Funktionsdefinition – understack
ausgezeichnete Antwort. – understack
Genau das, was ich gesucht habe - danke –
Aufruf an undefinierte Methode SimpleXMLElement :: prependChild() – user254153