Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah anda boleh menghuraikan XML dengan berbilang ruang nama menggunakan SimpleXML dalam PHP?

Bagaimanakah anda boleh menghuraikan XML dengan berbilang ruang nama menggunakan SimpleXML dalam PHP?

Susan Sarandon
Susan Sarandonasal
2024-11-07 06:22:03176semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn