Как проверить xml с php

Я сделал api с запросом на мой XML-сайт.

но иногда некоторые клиенты отправляют мне недействительный 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> 

Solutions Collecting From Web of "Как проверить xml с php"

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

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

 /** * Class XmlValidator * @author Francesco Casula <fra.casula@gmail.com> */ 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, а также для тестирования.

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

XML DOMDocument :: validate

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

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

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

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

Если вы хотите проверить только в том случае, если документ хорошо сформирован (вы не заботитесь о действительности 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"); } 

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

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

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