Проверка PHP SimpleXMLElement с помощью XSD
Можно ли проверить элемент SimpleXML с помощью XSD-схемы, хранящейся в строке?
Я получаю этот ЗАВИТОК xml-кода:
<production_feedback>
<production_number>DA1100208</production_number>
<production_status>DONE</production_status>
</production_feedback>
Со своей стороны, я понимаю это так:
if ( $_SERVER['REQUEST_METHOD'] === 'POST' ){
$post_text = file_get_contents('php://input');
$xml = new SimpleXMLElement($post_text);
error_log(print_r($xml , true));
}
Это в моем error_log()
:
SimpleXMLElement Object\n(\n [production_number] => DA1100208\n [production_status] => PRODUCTION_IN_PROGRESS\n)\n
Таким образом, я могу получить доступ к данным с помощью Xpath. Это хорошо работает. Я хотел бы подтвердить это с помощью XSD. Возможно ли это или есть какой-либо другой способ 2 проверить строку XML с помощью строки XSD?
Это мой XSD, кстати, сохраненный в переменной:
$production_XSD ='<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="production_feedback">
<xs:complexType>
<xs:sequence>
<xs:element type="xs:string" name="production_number"/>
<xs:element type="xs:string" name="production_status"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>'
2 answers
Класс SimpleXMLElement не поддерживает это (что касается документации по php.net находится в актуальном состоянии).
DOMDocument предоставляет функции, которые вы ищете, используя метод DOMDocument::schemavalidatesource.
---- Оригинал
Класс XmlReader, однако, имеет метод setSchema, который можно использовать для проверки в файле XSD (Это не совсем то, что вы искали, но это то, что я нашел без полагаясь на любые внешние библиотеки)
Недавно мне понадобилось проверить var, содержащий строку XML, на соответствие файлу XSD, поэтому, если кто-то еще ищет это решение, пожалуйста, смотрите Ниже:
// $xml_feed is a string containing your XML content
// validate xml string with xsd file
$doc = new DOMDocument();
$doc->loadXML($xml_feed); // load xml
$is_valid_xml = $doc->schemaValidate('XSDs/FeedFile.xsd'); // path to xsd file
if (!$is_valid_xml){
echo '<b>Invalid XML:</b> validation failed<br>';
}else{
echo '<b>Valid XML:</b> validation passed<br>';
}
Если ваш XSD также хранится в строке, замените 'XSDs/feedfile.xsd' на var, содержащий ваш XSD.. надеюсь, кто-нибудь найдет это полезным!