PHP – анализировать данные из ответа SOAP

Я использую API валидатора W3, и я получаю такой ответ:

<?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Body> <m:markupvalidationresponse env:encodingStyle="http://www.w3.org/2003/05/soap-encoding" xmlns:m="http://www.w3.org/2005/10/markup-validator"> <m:uri>http://myurl.com/</m:uri> <m:checkedby>http://validator.w3.org/</m:checkedby> <m:doctype>-//W3C//DTD XHTML 1.1//EN</m:doctype> <m:charset>utf-8</m:charset> <m:validity>false</m:validity> <m:errors> <m:errorcount>1</m:errorcount> <m:errorlist> <m:error> <m:line>7</m:line> <m:col>80</m:col> <m:message>character data is not allowed here</m:message> <m:messageid>63</m:messageid> <m:explanation> <![CDATA[ PAGE HTML IS HERE ]]> </m:explanation> <m:source><![CDATA[ HTML AGAIN ]]></m:source> </m:error> ... </m:errorlist> </m:errors> <m:warnings> <m:warningcount>0</m:warningcount> <m:warninglist> </m:warninglist> </m:warnings> </m:markupvalidationresponse> </env:Body> </env:Envelope> 

Как я могу извлечь некоторые переменные?

Мне нужна validity , errorcount и, если возможно, из списка ошибок: line , col и message 🙂

Есть ли простой способ сделать это?

    Вы можете загрузить XML-строку в SimpleXMLElement с помощью simplexml_load_string а затем найти атрибуты с помощью XPath. Очень важно зарегистрировать пространства имен, связанные с registerXPathNamespace перед использованием XPath.

     $xml = file_get_contents('example.xml'); // $xml should be the XML source string $doc = simplexml_load_string($xml); $doc->registerXPathNamespace('m', 'http://www.w3.org/2005/10/markup-validator'); $nodes = $doc->xpath('//m:markupvalidationresponse/m:validity'); $validity = strval($nodes[0]); echo 'is valid: ', $validity, "\n"; $nodes = $doc->xpath('//m:markupvalidationresponse/m:errors/m:errorcount'); $errorcount = strval($nodes[0]); echo 'total errors: ', $errorcount, "\n"; $nodes = $doc->xpath('//m:markupvalidationresponse/m:errors/m:errorlist/m:error'); foreach ($nodes as $node) { $nodes = $node->xpath('m:line'); $line = strval($nodes[0]); $nodes = $node->xpath('m:col'); $col = strval($nodes[0]); $nodes = $node->xpath('m:message'); $message = strval($nodes[0]); echo 'line: ', $line, ', column: ', $col, ' message: ', $message, "\n"; } 

    Вы должны использовать SOAP-библиотеку, чтобы получить это в первую очередь. Существуют различные варианты, которые вы можете попробовать для этого; nusoap, http://php.net/manual/en/book.soap.php , в системе zend также есть клиент и сервер SOAP, которые вы можете использовать. Независимо от того, какая реализация вы используете, вы сможете каким-то образом получить данные. Выполнение var_dump () над тем, что содержит начальный ответ, должно помочь вам в навигации по нему.

    Если вы предпочитаете использовать класс DOMDocument из php . Вам не нужно знать Xpath, чтобы это работало. Пример:

     $url = "http://www.google.com"; $xml = new DOMDocument(); $xml->load("http://validator.w3.org/check?uri=".urlencode($url)."&output=soap12"); $doctype = $xml->getElementsByTagNameNS('http://www.w3.org/2005/10/markup-validator', 'doctype')->item(0)->nodeValue; $valid = $xml->getElementsByTagNameNS('http://www.w3.org/2005/10/markup-validator', 'validity')->item(0)->nodeValue; $errorcount = $xml->getElementsByTagNameNS('http://www.w3.org/2005/10/markup-validator', 'errorcount')->item(0)->nodeValue; $warningcount = $xml->getElementsByTagNameNS('http://www.w3.org/2005/10/markup-validator', 'warningcount')->item(0)->nodeValue; $errors = $xml->getElementsByTagNameNS('http://www.w3.org/2005/10/markup-validator', 'error'); foreach ($errors as $error) { echo "<br>line: ".$error->childNodes->item(1)->nodeValue; echo "<br>col: ".$error->childNodes->item(3)->nodeValue; echo "<br>message: ".$error->childNodes->item(5)->nodeValue; } 

    // item () аргументы неравны, потому что пустой текст между тегами считается элементом.