Birden fazla isim olan SimpleXML ile XML Ayrıştırma

4 Cevap php

Ben ben ben bir xml nesne almak istiyorum ilk ad belirtmek eğer SimpleXML ile yüklemeye çalıştığınızda, üzerinde ad alanları bir sürü vardır, bu çirkin XML sahip, ancak diğer ad alanları ile aşağıdaki etiketleri nesneye yapmazdım.

Nasıl bu XML ayrıştırma yapabilir?

<?xml version="1.0" encoding="UTF-8"?>
<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>

im Aşağıdaki kod ile bunu ayrıştırmak için çalışıyor

<?php
$xml = simplexml_load_string($res,NULL,NULL,"http://schemas.xmlsoap.org/soap/envelope/");
?>

ama $ xml nesne yalnızca aşağıdaki içerecektir

SimpleXMLElement Object
(
    [Header] => SimpleXMLElement Object
        (
        )

    [Body] => SimpleXMLElement Object
        (
        )

)

4 Cevap

Ben XPath ile Namespacing ve erişim kaydetmeniz gerekir düşünüyorum. Aşağıdaki gibi bir şey (bunu test etmek için tesis yok yok) gitmeliyiz.

$xml = simplexml_load_string($res, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/");
$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');

Sonra gibi bir şey yapabilirsiniz:

foreach($xml->xpath('//eb:MessageHeader') as $header)
{
    var_export($header->xpath('//eb:CPAId')); // Should output 'something'.
}

Onlar XML Üyeliğiniz mevcut olduğu gibi, bu konuda düşünme, Namespacing kayıt için gerek olmayabilir. Bu olsa emin değil, test etmek gerekir.

Umarım bu yardımcı olur.

Yani sabun-zarf. Sen uzakta soyut tüm xml ayrıştırma bir sabun-istemcisi kullanmak isteyebilirsiniz. PHP comes with a rather good soap-client varsayılan olarak dahil.

Bu deneyin

   $soap_url = 'http://path/wsdl/somefile.wsdl';
   $soap_client = new SoapClient($soap_url);

   var_dump($soap_client->__getFunctions());

Daha fazla ayrıntı için read here