Come validationre xml con php

Ho fatto una API con richiesta basata su xml per il mio sito web.

ma a volte, alcuni clienti mi inviano un xml non valido e voglio restituire una buona risposta.

come posso validationre xml?

modificato:

Ok, penso di aver posto una domanda sbagliata, voglio validationre i nodes e se mancano alcuni nodes, restituisco la migliore risposta.

Ho usato per validationre questo con php e devo controllare each nodo. ma in questo modo è molto difficile da modificare.

è il mio esempio 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> 

Sfortunatamente XMLReader non ha validationto molte cose nel mio caso.

Ecco un piccolo pezzo di class che ho scritto qualche tempo fa:

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

Funziona bene anche con stream e vfsStream a scopo di test.

La documentazione di PHP ha esattamente ciò di cui hai bisogno!

XML DOMDocument :: validate

Sono sicuro che hai già definito il DTD corretto, giusto?

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

È ansible utilizzare XMLReader::isValid() .

 <?php $xml = XMLReader::open('xmlfile.xml'); // You must to use it $xml->setParserProperty(XMLReader::VALIDATE, true); var_dump($xml->isValid()); ?> 

Se vuoi controllare solo se il documento è ben formato (non ti interessa la validità della DTD e non hai nemless una DTD da validare) usa Domdocument per validare il tuo file, piuttosto che XMLReader, perché XMLReader scorrerà in streaming si documenta e non si carica in una sola volta, quindi il metodo isValid () controllerà solo il primo nodo. Puoi provare un codice come questo:

  $doc = new \DOMDocument(); if(@$doc->load($filePath)){ var_dump("$filePath is a valid XML document"); } else { var_dump("$filePath is NOT a valid document"); } 

Puoi usare la function PHP: –

 $xmlcontents = XMLReader::open('filename.xml'); $xmlcontents->setParserProperty(XMLReader::VALIDATE, true); var_dump($xmlcontents->isValid()); 

Fonte: – http://php.net/manual/en/xmlreader.isvalid.php