Heim >Backend-Entwicklung >PHP-Tutorial >Wie können Sie XML mit mehreren Namespaces mithilfe von SimpleXML in PHP analysieren?

Wie können Sie XML mit mehreren Namespaces mithilfe von SimpleXML in PHP analysieren?

Susan Sarandon
Susan SarandonOriginal
2024-11-07 06:22:03252Durchsuche

How can you parse XML with multiple namespaces using SimpleXML in PHP?

XML mit mehreren Namespaces mit SimpleXML analysieren

Die Aufgabe, XML mit mehreren Namespaces zu analysieren, kann bei der Arbeit mit SimpleXML entmutigend sein. Dies liegt daran, dass SimpleXML eine explizite Deklaration von Namespaces erfordert, um auf Elemente aus anderen Namespaces zuzugreifen.

Betrachten Sie das folgende XML mit mehreren Namespaces:

<code class="xml"><soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
    <soap-env:Header>
        <eb:MessageHeader xmlns:eb="http://www.ebxml.org/namespaces/messageHeader" eb:version="1.0" soap-env:mustUnderstand="1">
            <eb:From>
                <eb:PartyId eb:type="URI">wscompany.com</eb:PartyId>
            </eb:From>
            <eb:To>
                <eb:PartyId eb:type="URI">mysite.com</eb:PartyId>
            </eb:To>
            <eb:CPAId>something</eb:CPAId>
            <eb:ConversationId>moredata.com</eb:ConversationId>
            <eb:Service eb:type="compXML">theservice</eb:Service>
            <eb:Action>theaction</eb:Action>
            <eb:MessageData>
                <eb:MessageId>a certain messageid</eb:MessageId>
                <eb:Timestamp>2009-04-11T18:43:58</eb:Timestamp>
                <eb:RefToMessageId>mid:areference</eb:RefToMessageId>
            </eb:MessageData>
        </eb:MessageHeader>
        <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext">
            <wsse:BinarySecurityToken valueType="String" EncodingType="wsse:Base64Binary">an impresive binary security toekn</wsse:BinarySecurityToken>
        </wsse:Security>
    </soap-env:Header>
    <soap-env:Body>
        <SessionCreateRS xmlns="http://www.opentravel.org/OTA/2002/11" version="1" status="Approved">
            <ConversationId>the goodbye token</ConversationId>
        </SessionCreateRS>
    </soap-env:Body>
</soap-env:Envelope></code>

Versuch, dieses XML mit SimpleXML zu laden, ohne die Namespaces zu registrieren führt dazu, dass nur der erste Namespace erkannt wird. Um dies richtig zu analysieren, müssen wir die Namespaces registrieren und XPath-Ausdrücke erstellen, die sie berücksichtigen.

<code class="php">$xml = simplexml_load_string($res);
$xml->registerXPathNamespace('soap-env', 'http://schemas.xmlsoap.org/soap/envelope/');
$xml->registerXPathNamespace('eb', 'http://www.ebxml.org/namespaces/messageHeader');
$xml->registerXPathNamespace('wsse', 'http://schemas.xmlsoap.org/ws/2002/12/secext');

// Getting the CPAId using XPath
$cpaId = $xml->xpath('//eb:CPAId');
var_export($cpaId); // Outputs: [SimpleXMLElement]

// Getting the BinarySecurityToken using XPath
$token = $xml->xpath('//wsse:BinarySecurityToken');
var_export($token); // Outputs: [SimpleXMLElement]</code>

Dieser aktualisierte Code registriert die Namespaces und verwendet XPath-Ausdrücke, um auf Elemente aus den verschiedenen Namespaces zuzugreifen, was uns dies ermöglicht Analysieren Sie das XML trotz mehrerer Namespaces effektiv.

Das obige ist der detaillierte Inhalt vonWie können Sie XML mit mehreren Namespaces mithilfe von SimpleXML in PHP analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn