Проверка 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>'
Author: Barta Tamás, 2012-09-20

2 answers

Класс SimpleXMLElement не поддерживает это (что касается документации по php.net находится в актуальном состоянии).

DOMDocument предоставляет функции, которые вы ищете, используя метод DOMDocument::schemavalidatesource.

---- Оригинал

Класс XmlReader, однако, имеет метод setSchema, который можно использовать для проверки в файле XSD (Это не совсем то, что вы искали, но это то, что я нашел без полагаясь на любые внешние библиотеки)

 5
Author: Louis Huppenbauer, 2015-03-23 22:38:17

Недавно мне понадобилось проверить 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.. надеюсь, кто-нибудь найдет это полезным!

 0
Author: DonMichael, 2017-04-22 06:42:50