2011-02-19 78 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()參數不均勻,因爲標記之間的空文本被計爲項目。