Menghuraikan XML dengan Berbilang Ruang Nama Menggunakan SimpleXML
Tugas menghuraikan XML dengan berbilang ruang nama boleh menjadi menakutkan apabila bekerja dengan SimpleXML. Ini kerana SimpleXML memerlukan pengisytiharan eksplisit ruang nama untuk mengakses elemen daripada ruang nama lain.
Pertimbangkan XML berikut dengan berbilang ruang nama:
<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>
Percubaan untuk memuatkan XML ini menggunakan SimpleXML tanpa mendaftarkan ruang nama akan menyebabkan hanya ruang nama pertama dikenali. Untuk menghuraikan ini dengan betul, kita perlu mendaftarkan ruang nama dan mencipta ungkapan XPath yang mengambil kiranya.
<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>
Kod yang dikemas kini ini mendaftarkan ruang nama dan menggunakan ungkapan XPath untuk mengakses elemen daripada ruang nama yang berbeza, membolehkan kami untuk menghuraikan XML dengan berkesan walaupun mempunyai berbilang ruang nama.
Atas ialah kandungan terperinci Bagaimanakah anda boleh menghuraikan XML dengan berbilang ruang nama menggunakan SimpleXML dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!