Проблемы пространства имен SimpleXML SOAP ответа

После пребывания в течение НЕСКОЛЬКИХ разбитых часов на этом я прошу Вашу справку.

Я пытаюсь получить содержание конкретных узлов от ответа SOAP.

Ответ


http://www.w3.org/2003/05/soap-envelope"http://soap.xxxxxx.co.uk/">
    
        
            
            
                
                    24
                    The+client+order+number+3002254+is+already+in+use
                
                
                    1
                    Aborting
                
            
        
    

Я пытаюсь достигнуть узлы и детей . Из-за XML, содержащего пространства имен

$XmlArray   = new SimpleXMLElement($XmlStr);

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

не работает. Я прочитал много статей такой как

и приблизительно 20 вопросов на этом сайте, которые, к сожалению, не помогают.

Даже запись,

$XmlArray   = new SimpleXMLElement($XmlStr);

echo "

\n";
print_r($XmlArray);
echo "


\n";

дает

SimpleXMLElement Object
(
)

который заставляет меня задаться вопросом, является ли ответ мыла ($XmlStr) на самом деле допустимым входом для SimpleXMLElement.

Кажется что строка

$XmlArray   = new SimpleXMLElement($XmlStr);

не делает то, к чему я ожидаю это.

Любая справка о том, как получить узлы от XML выше, очень приветствовалась бы.

Очевидно, получение этого работать (наличие рабочего примера) - то, в чем я нуждаюсь в ближайшей перспективе, но если кто-то мог бы помочь мне понять то, что я делаю, неправильно было бы лучше в долгосрочной перспективе.

Удачи. Stu

5
задан Artefacto 11 June 2010 в 12:30
поделиться

1 ответ

Вы должны использовать SimpleXMLElement::children(), хотя на данном этапе, вероятно, было бы проще использовать 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 />";
    } 

дает:

24 The+client+order+number+3002254+is+already+in+use
1 Aborting
14
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: