example - PHP-analizar datos de una respuesta SOAP
soapclient php ejemplo (3)
Estoy usando la API del validador W3 y obtengo este tipo de respuesta:
<?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>
¿Cómo puedo extraer algunas variables de allí?
Necesito validity
, errorcount
y si es posible de la lista de errores: line
, col
y message
:)
¿Hay una manera fácil de hacer esto?
Si prefiere usar la clase DOMDocument de php . No es necesario que conozcas a Xpath para que funcione. Un ejemplo:
$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;
}
// los argumentos de item () son desiguales porque el texto vacío entre etiquetas se cuenta como un elemento.
Deberías usar una biblioteca SOAP para obtener esto en primer lugar. Hay varias opciones que puedes probar para esto; nusoap, http://php.net/manual/en/book.soap.php , Zend Framework también tiene un cliente y servidor SOAP que puede usar. Cualquier implementación que use le permitirá obtener los datos de alguna manera. Hacer un var_dump () en lo que contenga la respuesta inicial debería ayudarte a navegar a través de él.
Puede cargar la cadena XML en un SimpleXMLElement
con simplexml_load_string
y luego encontrar los atributos usando XPath. Es importante registrar los espacios de nombres implicados con registerXPathNamespace
antes de usar 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";
}