При попытке проверки объекта PHP DOMDocument против схемы с использованием метода schemaValidate, следующее предупреждение генерируется:Элемент 'foo': этот элемент не ожидается. Ожидаемый есть ({http://www.example.com} Foo)
Предупреждения: DOMDocument :: schemaValidate(): Element 'foo': Этот элемент не указан . Ожидается ({http://www.example.com} foo). в X по линия Y
Это происходит только с элементами, которые были добавлены в DOMDocument. Я подготовил следующий фрагмент кода и схемы, так что каждый может проверить мгновенно:
Snippet:
$template = '
<root
xmlns="http://www.example.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com schema.xsd"
>
<bar/>
</root>
';
$DD = new DOMDocument();
$DD -> loadXML($template);
$foo = $DD -> createElement('foo');
$DD -> getElementsByTagName('root') -> item(0) -> appendChild($foo);
var_dump(htmlentities($DD -> saveXML()));
var_dump($DD -> schemaValidate(__DIR__ . '/schema.xsd'));
Схема:
<?xml version="1.0"?>
<xs:schema
targetNamespace="http://www.example.com"
xmlns:SiiDte="http://www.example.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
>
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element name="bar"/>
<xs:element name="foo"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Я не вижу разницы между обув и бар, кроме foo, был добавлен с помощью метода appendChild, тогда как панель добавлена с помощью метода loadXML.
Подтверждение возвращает false (что означает ошибку проверки). При загрузке foo с помощью метода loadXML ошибка останавливается, но это определенно не решение, потому что XML нужно создавать динамически во многих случаях.
¿Почему добавочный элемент создает эту ошибку проверки и как ее решить?
я не заметил, потому что только с помощью пространства имен по умолчанию. Но спасибо, не знал, что необходимо указать пространство имен в этом случае. – mikl
Да, о части, которая * не * очевидна из взгляда на XML (у меня было это короткое и неправильное в моей первой ревизии ответа) Я добавил лучшее объяснение (надеюсь!).Я также разместил код-пример, демонстрирующий его в действии. – hakre