Home > Article > Backend Development > How can you parse XML with multiple namespaces using SimpleXML in PHP?
Parsing XML with Multiple Namespaces Using SimpleXML
The task of parsing XML with multiple namespaces can be daunting when working with SimpleXML. This is because SimpleXML requires explicit declaration of namespaces to access elements from other namespaces.
Consider the following XML with multiple 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>
Attempting to load this XML using SimpleXML without registering the namespaces will result in only the first namespace being recognized. To parse this correctly, we need to register the namespaces and create XPath expressions that account for them.
<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>
This updated code registers the namespaces and uses XPath expressions to access elements from the different namespaces, enabling us to parse the XML effectively despite having multiple namespaces.
The above is the detailed content of How can you parse XML with multiple namespaces using SimpleXML in PHP?. For more information, please follow other related articles on the PHP Chinese website!