2013-06-19 36 views
6

Web sitem için xml tabanlı bir istekte bulundum.php ile nasıl xml doğrulanır

Ancak bazen bazı müşteriler bana geçersiz bir xml gönderir ve iyi bir yanıt vermek istiyorum.

xml'yi nasıl doğrulayabilirim?

düzenlendi:

Tamam, ben düğümleri doğrulamak istiyor ve bazı düğümler sonra eksik olmadığını en iyi yanıtı dönmek, yanlış soru soruldu düşünüyorum.

Bunu php ile doğrulamak için kullanılır ve her düğümü kontrol etmek zorundayım. ama bu şekilde değiştirmek çok zordur.

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

da [XML hataları ile ilgilenmek] deneyebilirsiniz (http://php.net/manual/en/simplexml.examples-errors.php) –

+0

sağlamanız gerekiyor Bize: Doğru XML örneğidir (gönderdiğiniz mesajın geçerli olduğunu varsayalım), DTD'niz, WRONG XML'in bir örneği (veya daha fazlası) ve ilişkili "en iyi yanıt". Aksi halde çok yardım almayacaksın. –

+0

@Userpassword: bu soruna yakın bile değil ... – Pooya

cevap

1

Sen XMLReader::isValid() kullanabilirsiniz:

benim xml örneğidir.

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

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

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

OR: XMLReader :: string'ten readString – user956584

+1

Not: Bu, tüm belgeyi değil, geçerli düğümü denetler. – Amaynut

2

PHP belgelerinde tam olarak ihtiyacınız olan şey var!

XML DOMDocument::validate

Ben zaten doğru, düzgün DTD tanımladıktan eminim?

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

veya dizgeden yükle: $ dom-> loadHTML ($ string); – user956584

0

PHP işlevini kullanabilirsiniz: -

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

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

var_dump($xmlcontents->isValid()); 

Kaynak: -

+0

Not: Bu, tüm belgeyi değil, geçerli düğümü denetler. – Amaynut

10

http://php.net/manual/en/xmlreader.isvalid.php Maalesef XMLReader benim durumumda çok şeyler doğrulamak vermedi.

İşte sınıfın küçük bir parça Bir süre önce yazmış:

/** 
* 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); 
    } 
} 

Bu akarsular ve vfsStream için de test amaçlı çalışıyor.

+0

, DOMDocument :: loadXML() öğesini önlemek için ekledi: girdi hatası olarak verilen boş dize –

1

Yalnızca belgenin iyi oluşturulup oluşturulmadığını (DTD'nin geçerliliğini umursamıyorsanız ve doğrulamak için bir DTD'niz yoksa) kontrol etmek isterseniz, XMLReader yerine dosyanızı doğrulamak için Domdocument kullanın. XMLReader size belge akışı yapacak ve bir kerede yüklemeyeceğinden, isValid() yöntemi yalnızca ilk düğümü kontrol edecektir. Böyle bir kod deneyebilirsiniz:

$doc = new \DOMDocument(); 

if(@$doc->load($filePath)){ 
    var_dump("$filePath is a valid XML document"); 
} else { 
     var_dump("$filePath is NOT a valid document"); 
} 
İlgili konular