2013-06-19 2 views
6

Я сделал api с запросом на мой XML для моего сайта.Как проверить xml с php

, но иногда некоторые клиенты отправляют мне недействительный xml, и я хочу вернуть хороший ответ.

как я могу проверить xml?

отредактировано:

Хорошо, я думаю, что я спросил неправильный вопрос, я хочу проверить узлы и если некоторые узлы отсутствуют, то я возвращаю лучший ответ.

Я использовал для проверки этого с помощью php, и я должен проверить все узлы. , но этот способ очень трудно изменить.

это мой XML пример:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<mashhadhost> 
    <create> 
     <name>example.ir</name> 
     <period>60</period> 
     <ns> 
      <hostAttr> 
       <hostName>ns1.example.ir</hostName> 
       <hostAddr ip="v4">192.0.2.2</hostAddr> 
      </hostAttr> 
     </ns> 
     <contact type="holder">ex61-irnic</contact> 
     <contact type="admin">ex61-irnic</contact> 
     <contact type="tech">ex61-irnic</contact> 
     <contact type="bill">ex61-irnic</contact> 
    </create> 
    <auth> 
     <code>TOKEN</code> 
    </auth> 
</mashhadhost> 
+0

вы также можете попробовать [Работа с ошибками XML] (http://php.net/manual/en/simplexml.examples-errors.php) –

+0

Вы должны предоставить us: пример правильного XML (предположим, что вы опубликовали действительный), ваш DTD, пример (или более) WRONG XML и связанный с ним «лучший ответ». В противном случае вам не поможет. –

+0

@Userpassword: na, это даже не близко к моему вопросу ... – Pooya

ответ

1

Вы можете использовать XMLReader::isValid().

<?php 
    $xml = XMLReader::open('xmlfile.xml'); 

    // You must to use it 
    $xml->setParserProperty(XMLReader::VALIDATE, true); 

    var_dump($xml->isValid()); 
?> 
+0

OR: XMLReader :: readString from string – user956584

+1

Примечание: Это проверяет текущий узел, а не весь документ. – Amaynut

2

Документация PHP имеет именно то, что вам нужно!

XML DOMDocument::validate

Я уверен, что вы уже определили правильный DTD, верно?

<?php 
$dom = new DOMDocument; 
$dom->Load('book.xml'); 
if ($dom->validate()) { 
    echo "This document is valid!\n"; 
} 
?> 
+0

или загрузить из строки: $ dom-> loadHTML ($ string); – user956584

0

Вы можете использовать функцию PHP: -

$xmlcontents = XMLReader::open('filename.xml'); 

$xmlcontents->setParserProperty(XMLReader::VALIDATE, true); 

var_dump($xmlcontents->isValid()); 

Источник: - http://php.net/manual/en/xmlreader.isvalid.php

+0

Примечание. Это проверяет текущий узел, а не весь документ. – Amaynut

10

К сожалению XMLReader не проверяла много вещей в моем случае.

Вот небольшой кусочек класса я написал некоторое время назад:

/** 
* Class XmlValidator 
* @author Francesco Casula <[email protected]> 
*/ 
class XmlValidator 
{ 
    /** 
    * @param string $xmlFilename Path to the XML file 
    * @param string $version 1.0 
    * @param string $encoding utf-8 
    * @return bool 
    */ 
    public function isXMLFileValid($xmlFilename, $version = '1.0', $encoding = 'utf-8') 
    { 
     $xmlContent = file_get_contents($xmlFilename); 
     return $this->isXMLContentValid($xmlContent, $version, $encoding); 
    } 

    /** 
    * @param string $xmlContent A well-formed XML string 
    * @param string $version 1.0 
    * @param string $encoding utf-8 
    * @return bool 
    */ 
    public function isXMLContentValid($xmlContent, $version = '1.0', $encoding = 'utf-8') 
    { 
     if (trim($xmlContent) == '') { 
      return false; 
     } 

     libxml_use_internal_errors(true); 

     $doc = new DOMDocument($version, $encoding); 
     $doc->loadXML($xmlContent); 

     $errors = libxml_get_errors(); 
     libxml_clear_errors(); 

     return empty($errors); 
    } 
} 

Он отлично работает с потоками и vfsStream, а также для целей тестирования.

+0

добавлена ​​проверка, чтобы избежать «DOMDocument :: loadXML(): пустая строка, предоставленная как входная ошибка –

1

Если вы хотите проверить, только если документ хорошо сформирован (вы не заботитесь о действительности DTD и даже не имеете DTD для проверки), используйте Domdocument для проверки вашего файла, а не XMLReader, потому что XMLReader будет передавать вам документ и не загружать его сразу, поэтому метод isValid() проверяет только первый узел. Вы можете попробовать такой код:

$doc = new \DOMDocument(); 

if(@$doc->load($filePath)){ 
    var_dump("$filePath is a valid XML document"); 
} else { 
     var_dump("$filePath is NOT a valid document"); 
} 
Смежные вопросы