2011-02-19 77 views
3

我使用的是W3验证API解析数据,我得到这样的回答:PHP - 从SOAP响应

<?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> 

我如何可以提取一些变量从那里?

我需要validityerrorcount,如果可能从错误列表:linecol,并且message :)

有没有一种简单的方法来做到这一点?

+2

http://php.net/manual/en/book.simplexml.php,它被称为简单的原因 – 2011-02-19 03:38:49

回答

5

您可以将XML字符串加载到SimpleXMLElementsimplexml_load_string,然后使用XPath查找属性。在使用XPath之前注册与registerXPathNamespace有关的命名空间很重要。

$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"; 
} 
3

您应该首先使用SOAP库来获取此信息。你可以尝试各种选择; nusoap,http://php.net/manual/en/book.soap.php,zend框架也有你可以使用的SOAP客户端和服务器。无论您使用哪种实现方式,都可以让您以某种方式获取数据。对任何初始响应进行var_dump()应该可以帮助您浏览它。

3

如果您宁愿使用DOMDocument class from 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()参数不均匀,因为标记之间的空文本被计为项目。