Я использую следующий код для создания DOMDocument и проверки его по внешнему файлу xsd.
<?php
$xmlPath = "/xml/some/file.xml";
$xsdPath = "/xsd/some/schema.xsd";
$doc = new \DOMDocument();
$doc->loadXML(file_get_contents($xmlPath), LIBXML_NOBLANKS);
if (!$doc>schemaValidate($xsdPath)) {
throw new InvalidXmlFileException();
}
Обновление 2 (переписанный вопрос)
Это работает нормально, это означает, чтоесли XML не соответствует определениям XSD, он выдаст осмысленное исключение.
Теперь я хочу получить информацию из DOMDocument, используя Xpath.Он также отлично работает, но с этого момента DOMDocument полностью отсоединен от XSD!Например, если у меня есть DOMNode , я не могу знать, относится ли он к типу simpleType или к типу complexType .Я могу проверить, есть ли у узла дочерние ( hasChild () ) узлы, но это не одно и то же.Кроме того, в XSD содержится больше информации (например, минимальное и максимальное количество вхождений и т. Д.).
Вопрос на самом деле в том, должен ли я сам запросить XSD или существует программный способзадавать такие вопросы.Т.е. это DOMNode сложный или простой тип?
В другом посте было предложено "обработать схему с использованием реального процессора схем, а затем использовать ее APIзадавать вопросы о содержании схемы ".Как бы вы сделали это с DOMDocument?
Для записи, оригинальный вопрос
Теперь я хотел бы приступить к анализу информации из DOMDocument с использованием XPath.Чтобы повысить целостность моих данных, я храню их в базе данных и даю клиенту осмысленное сообщение об ошибке. Я хотел постоянно использовать информацию схемы для проверки запросов.Т.е. я хотел проверить извлеченные дочерние узлы в отношении разрешенных дочерних узлов, определенных в xsd.Я хотел сделать это с помощью XPath в документе xsd.
Однако я перебрал этот пост .По сути, это говорит о том, что это какой-то изворотливый способ, и вы должны использовать реальный процессор схемы и использовать его API для выполнения запросов.Если я правильно понимаю, я использую настоящий процессор схемы с schemaValidate
, но что подразумевается под использованием его API?
Я уже догадывался, что не правильно использую схему, но я понятия не имею, как исследовать правильное использование.
Вопрос
Если я использую schemaValidate
в DOMDocument, это одноразовая проверка (true или false) или она связана с DOMDocument дольше, чем?Точно, могу ли я использовать проверку также для добавления узлов каким-либо образом или я могу использовать ее для выбора узлов, которые меня интересуют, как предложено в упомянутом сообщении SO?
Обновить
Вопрос был оцененнеясно, поэтому я хочу попробовать еще раз.Скажем, я хотел бы добавить узел или изменить значение узла.Могу ли я использовать схему, представленную в xsd, чтобы я мог проверить вводимые пользователем данные?Первоначально для этого я хотел вручную запросить xsd с другим экземпляром XPath, чтобы получить спецификации для определенного узла.Но, как предлагается в связанной статье, это не лучшая практика.Таким образом, вопрос заключается в том, предлагает ли библиотека DOM какой-либо API для такой проверки?
Может быть, я думаю об этом.Может быть, я просто добавляю узел и снова запускаю проверку и вижу, где / почему он ломается?В этом случае ответ пользовательской обработки ошибок будет правильным.Вы можете подтвердить?