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

Susan Sarandon
Lepaskan: 2024-11-07 06:22:03
asal
240 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan