2009-04-11 9 views
10

मेरे पास यह बदसूरत एक्सएमएल है जिसमें उस पर नेमस्पेस हैं, जब मैं इसे सरल एक्सएमएल के साथ लोड करने का प्रयास करता हूं, तो अगर मैं पहला नेमस्पेस इंगित करता हूं तो मुझे एक्सएमएल ऑब्जेक्ट मिल जाएगा, लेकिन टैग के बाद अन्य नामस्थानों के साथ यह वस्तु को नहीं बनायेगा।सिंपलएक्सएमएल के साथ एक एक्सएमएल पार्स करें जिसमें एकाधिक नेमस्पेस हैं

मैं इस XML को कैसे पार्स कर सकता हूं?

<?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 निम्नलिखित कोड

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

लेकिन $ एक्सएमएल वस्तु के साथ यह पार्स करने के लिए केवल होते हैं निम्नलिखित

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

    [Body] => SimpleXMLElement Object 
     (
     ) 

) 

उत्तर

28

मैं तुम्हें नेमस्पेसिंग और उपयोग रजिस्टर करने की आवश्यकता लगता है की कोशिश कर रहा XPath के साथ। निम्नलिखित की तरह कुछ आपको जाना चाहिए (मुझे इसका परीक्षण करने की सुविधा नहीं है)।

$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'); 

तो फिर तुम जैसे कुछ कर सकते हैं:

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

आप नेमस्पेसिंग रजिस्टर करने की आवश्यकता नहीं हो सकता है, इस बारे में सोच के रूप में वे XML में alredy मौजूद हैं। हालांकि इस पर यकीन नहीं है, परीक्षण करने की आवश्यकता होगी।

उम्मीद है कि इससे मदद मिलती है।

+1

सीधे शब्दों में brillian आप न केवल मुझे मेरी समस्या का समाधान में मदद की, लेकिन यह भी स्पष्ट किया है कि कैसे xpath काम किया :) धन्यवाद! – perrohunter

+0

XPath पर स्विच करने की कोई आवश्यकता नहीं है क्योंकि आप नामस्थान का उपयोग कर रहे हैं। – IMSoP

+0

यदि आप XPath का उपयोग कर रहे हैं, तो आपको ऊपर दिए गए कोड में स्पष्ट रूप से नेमस्पेस पंजीकृत करने की आवश्यकता है, अन्यथा विफलता होती है। – Bobulous

0

यह एक साबुन लिफाफा है। आप सभी एक्सएमएल-पार्सिंग को अमूर्त करने के लिए एक साबुन-क्लाइंट का उपयोग करना चाह सकते हैं। PHP comes with a rather good soap-client डिफ़ॉल्ट के रूप में शामिल है।

7

1) print_r और मित्रों को यह देखने के लिए कि एक SimpleXML ऑब्जेक्ट में "इन" क्या है, का उपयोग न करें। स्पष्टीकरण और विकल्पों के लिए https://github.com/IMSoP/simplexml_debug देखें।

2) SimpleXML में नेमस्पेस समर्थन ->children() और ->attributes() विधियों द्वारा प्रदान किया गया है।

उदाहरण के लिए आप इस तरह नोड से की PartyId मिल सकता है:

$from_party = (string)$xml->children('soap-env', true)->Header->children('eb', true)->MessageHeader->From->PartyId; 
+0

द्वारा उलझन में रहा हूं यह मेरे लिए सबसे उपयोगी टिप्पणी थी, अच्छा है कि आप इंगित करते हैं कि print_r आदि काम नहीं करते हैं और simplexml_debug, props के लिए एक लिंक प्रदान करते हैं! –

+0

उन डीबग फ़ंक्शंस उन लोगों के लिए वास्तव में सहायक हैं जो इस के लिए नए हैं। – xdbas

0

के लिए यह

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

    var_dump($soap_client->__getFunctions()); 

प्रयास करें किसी और है कि इस मैं भर आता है के लिए मेरे सिर को सही डेटा वापस करने की कोशिश कर खरोंच कर दिया और हालांकि शीर्ष जवाब बहुत करीब था, फिर भी मुझे जवाब खोजने में थोड़ी देर लग गई। अंततः इस पृष्ठ का उपयोग करने में मदद के लिए: https://www.w3schools.com/php/func_simplexml_registerxpathnamespace.asp

मेरा मानना ​​है कि लूप के लिए आपको जो चाहिए वह सीधे पहुंच सकता है। अर्थात

foreach($xml->xpath('//eb:CPAId') as $header) 
{ 
    echo $header; // Should output 'something'. 
} 
संबंधित मुद्दे