Я пытаюсь получить значения или все атрибуты a: [дубликаты]

Я использовал PHP SimpleXML, simplexml_load_string и не получил ответа даже после использования DOM и SimpleXML.

//Ответ PHP XML

$xml = <<<XML
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
    <StatusResponse xmlns="http://tempuri.org/">
    <Result xmlns:a="http://schemas.datacontract.org/2004/07/OS.FLC" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <a:ResCode>OK</a:ResCode>
    <a:IDNumber>149897</a:IDNumber>
    <a:CusName>AXIOS ASOS</a:CusName>
    <a:HoldName>AXA AXIOS</a:HoldName>
    </Result>
    </StatusResponse>
    </s:Body>
    </s:Envelope>
    XML;

// используя PHP SIMPLE XML

$domContent = new SimpleXMLElement(((string)$xml), LIBXML_COMPACT);
$test = $domContent->xpath('/Result/a/*');
foreach ($test as $node) 
{
     print_r($node);
}

//Использование DOM

$domp = new DOMDocument('1.0', 'utf-8');
$domp->loadXML($xml);
$items = $domp->getElementsByTagName('a');
foreach ($items as $item) 
{
     $HOLDER = $item->getElementsByTagNameNS("http://schemas.datacontract.org/2004/07/OS.FLC", "*")->Result(0)->nodeValue;
     echo "HoldName = " . $HOLDER . PHP_EOL;
}


// Expected Result

ResCode = OK
IDNumber = 149897
CusName = AXIOS ASOS

person Zee4real    schedule 12.05.2019    source источник
comment
мой отличается тем, что узлы содержат столбцы ‹a:ResCode›OK‹/a:ResCode› ‹a:IDNumber›149897‹/a:IDNumber› ‹a:CusName›AXIOS ASOS‹/a:CusName› ‹a:HoldName› AXA AXIOS‹/a:HoldName› Как я могу получить эти значения   -  person Zee4real    schedule 12.05.2019
comment
Разные ? Действительно ? Я просто вижу больше пространств имен, чем в дублированном вопросе выше. Основы те же => var_dump($domContent->children('s', true)->Body->children()->StatusResponse->Result->children('a', true)). Мы можем согласиться, что это некрасиво. Но если вы хотите использовать XPath с simplexml, вам нужно зарегистрировать каждое пространство имен. вы используете   -  person Zeitounator    schedule 12.05.2019


Ответы (1)


Используя DOMDocument, вы можете использовать getElementsByTagNameNS и указать полный URL-адрес a :

$doc = new DOMDocument('1.0', 'utf-8');
$doc->loadXML($xml);

$elements = $doc->getElementsByTagNameNS('http://schemas.datacontract.org/2004/07/OS.FLC', '*');
foreach($elements as $elem)
{
    echo $elem->nodeName . ' -> ' . $elem->nodeValue ;
}

Вывод :

a:ResCode -> OK
a:IDNumber -> 149897
a:CusName -> AXIOS ASOS
a:HoldName -> AXA AXIOS
person Joffrey Schmitz    schedule 12.05.2019
comment
спасибо, это работает, но как мне настроить таргетинг на конкретный узел, скажем, например, $elem->CusName. Или я просто хочу получить значение a:IDNumber, как мне это сделать - новичок здесь - person Zee4real; 12.05.2019
comment
Вы можете заменить * (что означает «все») во втором аргументе функции на элемент, на который вы хотите настроить таргетинг (например, CusName) - person Joffrey Schmitz; 12.05.2019