hinzufügen eines namespace bei der Verwendung SimpleXMLElement
Dies ist, was ich nach
<!-- language: lang-xml -->
<ws:Test>
<ws:somename2>somevalue2</ws:somename2>
<ws:make>
<ws:model>foo</ws:model>
<ws:model>bar</ws:model>
</ws:make>
</ws:Test>
Dies ist mein Aktueller code
<!-- language: lang-php -->
$xmlTest = new SimpleXMLElement('<Test/>', 0, false, 'ws', true);
$xmlTest->addChild("ws:somename2", "somevalue2", 'http://microsoft.com/wsdl/types/');
$make = $xmlTest->addChild('ws:make', null, 'ws');
#$make->addAttribute('name','Ford');
$make->addChild('ws:model', 'foo', 'ws');
$make->addChild('ws:model', 'bar', 'ws');
header ("Content-Type:text/xml");
print_r($xmlTest->asXML());
aber es gibt
<!-- language: lang-xml -->
<Test>
<ws:somename2>somevalue2</ws:somename2>
<ws:make>
<ws:model>foo</ws:model>
<ws:model>bar</ws:model>
</ws:make>
</Test>
Wie Sie sehen können die ws: fehlende Test
InformationsquelleAutor der Frage sleep-er | 2011-08-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
SimpleXML hat eine ungewöhnliche Eigenart, in denen die namespace-Präfixe werden gefiltert vom root-element. Ich bin mir nicht sicher, warum er das tut.
Jedoch eine Problemumgehung, die ich verwendet habe, war im Grunde Präfix das Präfix, so dass der parser entfernt nur die ersten, und verlässt die zweite
Dies scheint zu funktionieren für mich, aber ich bin daran interessiert zu verstehen, warum SimpleXML tut genau dies.
InformationsquelleAutor der Antwort Kyril
Das Problem
Das problem mit diesem code wird in der ersten Zeile:
Bevor irgendetwas anderes tun, lassen Sie uns die Ausgabe dieses als XML:
Sinn macht, stiegen wir aus, was wir in.
Die Anleitung ist relativ vage, was die
$ns
argument macht, aber in diesem Fall ist es auch nicht tun, etwas sinnvolles. Was es tut, ist, den Kontext für Lesen das XML, so dass->foo
bezieht sich auf<ws:foo>
und['bar']
bezieht sich aufws:bar="..."
. Es muss nicht alles tun, um ändern Sie die Struktur der XML selbst.Setzen eines Root-Namespace
Um einen namespace auf das root-element, wir müssen nur in unsere string-Definition von root-element:
So weit So gut...
Einstellung Namespaces auf Kinder
Als Nächstes wollen wir die geistige Gesundheit überprüfen, was der code in der Frage tatsächlich Ausgänge (ich habe ein paar Leerzeichen, damit es besser lesbar):
OK, so dass dieses Dokument enthält zwei namespace-Deklarationen:
xmlns:ws="http://microsoft.com/wsdl/types/"
auf diesomename2
elementxmlns:ws="ws"
auf diemake
element, das ist dann vererbt diemodel
ElementeWas passiert, wenn wir unsere korrigierten root-element?
Cool, so die
somename2
element erbt nun dessen namespace-definition aus dem root-element, und nicht re-deklariert werden. Aber was ist falsch mit dermake
undmodel
s? Lassen Sie uns vergleichen:Dass Dritte argument soll die namespace-URInicht nur das Präfix. So Gaben wir es als
'ws'
SimpleXML angenommen, wir wollten zu erklären, dass die eigentlichen namespace-URI alsws
so ergänzt einxmlns
Attribut, das zu tun.Dem, was wir tatsächlich wollten, war, alle Elemente in der gleichen namespace:
Toll, wir haben unsere gewünschte Ausgabe!
Aufräumen
Aber der code sieht ziemlich hässlich, warum müssen wir wiederholen-URI überall? Nun, so weit wie SimpleXML ist besorgt, es gibt nicht viel Auswahl: das gleiche Präfix kann bedeuten, verschiedene Dinge in verschiedenen teilen des Dokuments, so müssen wir sagen, was wir wollen.
Was wir kann tun, ist aufzuräumen unseren code über eine variable oder Konstante für den namespace-URI an, sondern schreiben Sie es in voller jeder Zeit:
Gibt es nichts besonderes über den Namen
XMLNS_WS
hier, und es könnte ebenso eine variable, eine Klasse Konstante oder ein namespace konstant. Der code läuft genau das gleiche, es ist nur ein wenig leichter auf das Auge.InformationsquelleAutor der Antwort IMSoP
InformationsquelleAutor der Antwort MeTaL