Maison >développement back-end >tutoriel php >Comment analyser du XML avec plusieurs espaces de noms en utilisant SimpleXML en PHP ?

Comment analyser du XML avec plusieurs espaces de noms en utilisant SimpleXML en PHP ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-07 06:22:03301parcourir

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

Analyse XML avec plusieurs espaces de noms à l'aide de SimpleXML

La tâche d'analyse XML avec plusieurs espaces de noms peut être intimidante lorsque vous travaillez avec SimpleXML. En effet, SimpleXML nécessite une déclaration explicite des espaces de noms pour accéder aux éléments d'autres espaces de noms.

Considérez le XML suivant avec plusieurs espaces de noms :

<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>

Tentative de charger ce XML à l'aide de SimpleXML sans enregistrer les espaces de noms. seul le premier espace de noms sera reconnu. Pour analyser cela correctement, nous devons enregistrer les espaces de noms et créer des expressions XPath qui en tiennent compte.

<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>

Ce code mis à jour enregistre les espaces de noms et utilise des expressions XPath pour accéder aux éléments des différents espaces de noms, ce qui nous permet de analyser efficacement le XML malgré plusieurs espaces de noms.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn