2010-06-11 31 views
5

Sau khi dành SEVERAL giờ thất vọng về điều này, tôi yêu cầu sự giúp đỡ của bạn.Phản hồi SOAP SimpleXML Các vấn đề về không gian

Tôi đang cố gắng lấy nội dung của các nút cụ thể từ phản hồi SOAP.

Câu trả lời là

<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="<a href="http://www.w3.org/2003/05/soap-envelope">http://www.w3.org/2003/05/soap-envelope</a>"<xmlns:ns1="<a href="http://soap.xxxxxx.co.uk/">http://soap.xxxxxx.co.uk/</a>"> 
    <env:Body> 
     <ns1:PlaceOrderResponse> 
      <xxxxxOrderNumber></xxxxxOrderNumber> 
      <ErrorArray> 
       <Error> 
        <ErrorCode>24</ErrorCode> 
        <ErrorText>The+client+order+number+3002254+is+already+in+use</ErrorText> 
       </Error> 
       <Error> 
        <ErrorCode>1</ErrorCode> 
        <ErrorText>Aborting</ErrorText> 
       </Error> 
      </ErrorArray> 
     </ns1:PlaceOrderResponse> 
    </env:Body> 
</env:Envelope> 

tôi đang cố gắng để có được tại các nút và trẻ em của < ErrorArray>. Do không gian tên XML chứa

$XmlArray = new SimpleXMLElement($XmlStr); 

foreach ($XmlArray->env:Envelope->env:Body->ns1:PlaceOrderResponse->ErrorArray->Error as $Error) 
{ 
    echo $Error->ErrorCode."<br />"; 
} 

không hoạt động. Tôi đã đọc một số điều như

và khoảng 20 câu hỏi trên trang web này, mà tiếc là không giúp đỡ.

Thậm chí viết,

$XmlArray = new SimpleXMLElement($XmlStr); 

echo "<br /><br /><pre>\n"; 
print_r($XmlArray); 
echo "<pre><br /><br />\n"; 

cho

SimpleXMLElement Object 
(
) 

mà làm cho tôi tự hỏi, nếu phản ứng xà phòng ($ XmlStr) thực sự là một đầu vào hợp lệ cho SimpleXMLElement.

Dường như dòng

$XmlArray = new SimpleXMLElement($XmlStr); 

không làm những gì tôi mong đợi nó.

Bất kỳ trợ giúp nào về cách nhận các nút từ XML ở trên sẽ rất được hoan nghênh. Rõ ràng làm cho nó hoạt động (có một ví dụ làm việc) là những gì tôi cần trong ngắn hạn, nhưng nếu ai đó có thể giúp tôi hiểu những gì tôi đang làm sai sẽ tốt hơn trong thời gian dài.

Chúc mừng. Stu

Trả lời

12

Bạn phải sử dụng SimpleXMLElement::children(), mặc dù vào thời điểm này có thể sẽ dễ dàng hơn khi sử dụng XPath.

<?php 
    $XmlStr = <<<XML 
<?xml version="1.0" encoding="UTF-8"?> 
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://soap.xxxxxx.co.uk/" > 
    <env:Body> 
     <ns1:PlaceOrderResponse> 
      <xxxxxOrderNumber></xxxxxOrderNumber> 
      <ErrorArray> 
       <Error> 
        <ErrorCode>24</ErrorCode> 
        <ErrorText>The+client+order+number+3002254+is+already+in+use</ErrorText> 
       </Error> 
       <Error> 
        <ErrorCode>1</ErrorCode> 
        <ErrorText>Aborting</ErrorText> 
       </Error> 
      </ErrorArray> 
     </ns1:PlaceOrderResponse> 
    </env:Body> 
</env:Envelope> 
XML; 

    $XmlArray = new SimpleXMLElement($XmlStr); 

    $t = $XmlArray->children("env", true)->Body-> 
     children("ns1", true)->PlaceOrderResponse-> 
     children()->ErrorArray->Error; 
    foreach ($t as $error) { 
     echo $error->ErrorCode, " " , $error->ErrorText, "<br />"; 
    } 

cho:

 
24 The+client+order+number+3002254+is+already+in+use 
1 Aborting 
+0

THANK YOU !, Tôi đã rất gần. Tôi đã xem xét phương thức children() và đang sử dụng số foreach ($ XmlArray-> children ('env', true) -> Envelope-> children ('env', true) -> Body- > trẻ em ('ns1', đúng) -> PlaceOrderResponse-> ErrorArray-> Lỗi là $ Error) Một lần nữa, cảm ơn bạn :-) Ps các thẻ để định dạng mã chính xác trên stackoverflow là gì? Tôi không thể tìm thấy nó ở bên cạnh. – Stu

+0

@Stu Bạn chỉ cần nhấn nút 0101 với mã được chọn. Nhân tiện, nếu câu trả lời thực sự đạt yêu cầu, bạn nên chấp nhận nó. – Artefacto

0

Một cách rẻ tiền và khó chịu là chỉ cần chỉ cần loại bỏ các tiền tố:

$xml = preg_replace('%<(\/)?(\S+):(\w+)%', '<$1$3', $xml); 
Các vấn đề liên quan