2013-10-29 80 views
-1

我正在創建一個接受XML文檔的web服務,我所要做的就是發送一個true或false。 我的問題是如何驗證我接收到的XML並驗證每個節點是否有值。驗證XML數據驗證是否有值

例如,這將驗證:

<ItemUpdate> 
<ItemNmbr>1234</ItemNmbr> 
<ItemDesc>Part Number 1 - More info goes here</ItemDesc> 
<ItemPrice>8.25</ItemPrice> 
<Model>TC12B</Model> 
</ItemUpdate> 

但此數據不會

<ItemUpdate> 
<ItemNmbr></ItemNmbr> 
<ItemDesc>Part Number 1 - More info goes here</ItemDesc> 
<ItemPrice></ItemPrice> 
<Model>TC12B</Model> 
</ItemUpdate> 

下面是我如何處理數據爲止。我打開recomendations如果有什麼我失蹤:

<?PHP 

if ($_SERVER['REQUEST_METHOD'] === 'POST'){ 

    $dataPOST = trim(file_get_contents('php://input')); 
    $xmlData = simplexml_load_string($dataPOST); 

    //VALIDATE $xmlData; 

     if ($xmlData){ 
      echo true; 
     }else{ 
      echo false; 
     } 

} 

?> 

回答

3

定義XSD架構它,並調用後DOMDocument::schemaValidate。首先設置該模式可能有點用處,但從長遠來看,通常會付出代價。

+0

的模式可以是當前腳本的一部分?還是它必須在另一個文件?感謝您的信息。 +1 – Denoteone

+1

如果你想使用它作爲嵌入在你的文件中的字符串,你可以使用['DOMDocument :: schemaValidateSource'](http://www.php.net/manual/en/domdocument.schemavalidatesource.php)。然而,我會發現分開保存.xsd模式更方便,以便其他將來的代碼可以輕鬆使用它。 – Wrikken

1

你必須加載XML並通過每個節點重複,以檢查它是否爲空:

$doc = new DOMDocument(); 

    /* you can use your variable containing response from post here instead of 
    * hard coded string 
    */ 

    $doc->loadXML('<ItemUpdate><ItemNmbr>1234</ItemNmbr><ItemDesc>Part Number 1 - More info goes here</ItemDesc><ItemPrice>8.25</ItemPrice><Model>TC12B</Model></ItemUpdate>'); 

    $nodeBlank = false; 

    $x = $doc->documentElement; 
    foreach ($x->childNodes AS $item){ 
     if(trim($item->nodeValue) == ''){ 
      $nodeBlank = true; 
     } 
    } 

    if($nodeBlank){ 
     echo 'false'; 
    }else{ 
     echo 'true'; 
    } 
+0

這是我想到的,我只是不確定我將如何迭代數據。謝謝你的幫助。 +1 – Denoteone

+0

我不會將它用於XML。我會使用Wrikkens方式來處理模式驗證。 – DannyThunder