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());