2011-01-12 14 views
3

Ich versuche SimpleXML addChild-Methode des SimpleXMLElement (eigentlich ein SimpleXMLIterator, die eine Unterklasse von SimpleXMLElement ist), um untergeordnete Elemente hinzuzufügen.PHP SimpleXML-> addChild - unerwünschte leere Namespace Attribut

Mein Problem ist, dass das Quelldokument eine Mischung aus Elementen mit Namespaces und ohne enthält. Hier ist eine einfache (kein Wortspiel beabsichtigt) Beispiel:

<?xml version="1.0" encoding="UTF-8"?> 
    <ns1:a xmlns:ns1="http://www.abc.com"> 
</ns1:a> 

Der PHP-Code ist:

$it = new SimpleXMLIterator ('./test.xml', 0, true); 
$it->addChild('d', 'another!'); // adds new child element to parent's NS 
$it->addChild('c', 'no namespace for me!', ''); // puts xmlns="" every time :(

//output xml in response: 
header('Content-Type: text/xml'); 

echo $it->saveXML(); 

Das Problem - wie die Kommentar-Staaten - ist, dass, wenn ich will ein Kind Element platzieren mit kein Namensraum innerhalb des übergeordneten Elements mit einem Namespace, erhalte ich einen leerer XML-Namespace jedes Mal (Ausgabe von über PHP-Code) Attribut:

<?xml version="1.0" encoding="UTF-8"?> 
    <ns1:a xmlns:ns1="http://www.abc.com"> 
    <ns1:d>another!</ns1:d> 
    <c xmlns="">no namespace for me!</c> 
</ns1:a> 

Während bo th Web-Browser sowie XML-Parser (z.B. Xerces) scheint dieses überflüssige Markup nicht zu stören, ich finde es etwas nervig, dass ich es nicht zu sagen vermag, damit aufzuhören.

Wer hat eine Lösung oder übertrete ich?

:}

Antwort

5

Für SimpleXML c braucht einen Namespace. Wenn Sie einen angeben, wird ein xmlns-Attribut abgerufen, da das, was Sie angegeben haben, noch nicht deklariert wurde. Wenn Sie keinen Namespace für c angeben, übernimmt er den Namespace vom übergeordneten Knoten. Die einzige Option ist ns1. (Dies geschieht, um d.)

Um zu verhindern, inhertance des Mutternamespace und leer auslassen xmlns Sie einen Namespace wie xmlns="http://example.com" bei der Mutter bräuchten. Dann gibt $it->addChild('c', 'no ns', 'http://example.com') Sie <c>no ns</c>.

Sie können jedoch keine zusätzlichen Namespaces, z. mit addAttribute. Sie müssen die Eingabedatei bearbeiten, bevor sie von SimpleXML analysiert wird. Dies erscheint mir noch hässlicher als das Entfernen aller leeren xmlns-Attribute aus der Ausgabe.

+0

Rik, obwohl es immer noch erfordert, dass ich einen Namensraum habe, scheint es, dass Ihre Lösung eine gute Lösung ist - vor allem, wenn es sich um HTML handelt. Danke für Ihre schnelle Antwort und Antwort, sehr geschätzt. : D –