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!