元素 'foo':此元素不是预期的。预期是 ( {http://www.example.com}foo )
Element 'foo': This element is not expected. Expected is ( {http://www.example.com}foo )
尝试使用 schemaValidate 方法根据架构验证 PHP DOMDocument 对象时,将生成下一个警告:
Warning: DOMDocument::schemaValidate(): Element 'foo': This element is
not expected. Expected is ( {http://www.example.com}foo ). in X on
line Y
它只发生在附加到 DOMDocument 的元素上。我准备了下一个代码片段和架构,以便任何人都可以立即进行测试:
片段:
$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 和 bar 之间的区别,除了 foo 是用 appendChild 方法添加的,而 bar 添加是用 loadXML 方法添加的。
验证返回 false(这意味着验证错误)。当使用 loadXML 方法加载 foo 时,错误停止发生,但这绝对不是解决方案,因为在很多情况下需要动态创建 XML。
¿为什么附加元素会产生此验证错误以及如何解决?
您创建的元素 <foo>
是 "missing" 命名空间,因此在空命名空间中。
命名空间也是您在错误消息中的大括号(或尖括号)中看到的部分:
{http://www.example.com}foo
`----------------------´`-´
namespace name
而不是 createElement
使用 createElementNS
并在元素名称旁边提供命名空间。
当您将创建的文档另存为 XML(例如通过查看手动验证它)时,您完全正确地认为元素 似乎 喜欢 <bar>
:
<?xml version="1.0"?>
<root xmlns="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com schema.xsd">
<bar/>
<foo/></root>
但是它刚刚被添加到那里,它是 null namspace(因此插入时周围没有太多命名空间)并且在内存中该元素仍然没有命名空间 - 并且验证在内存中。
这是一个完整的验证示例:
<?php
/**
* Element 'foo': This element is not expected. Expected is ( {http://www.example.com}foo )
*
* @link
*/
$template = <<<XML
<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>
XML;
$schema = <<<XML
<?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>
XML;
$schema = 'data://text/xml;base64,' . base64_encode($schema);
$namespace = 'http://www.example.com';
$doc = new DOMDocument();
$doc->loadXML($template);
$foo = $doc->createElementNS($namespace, 'foo');
$doc->documentElement->appendChild($foo);
echo $doc->saveXML();
var_dump($doc->schemaValidate($schema));
输出为:
<?xml version="1.0"?>
<root xmlns="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com schema.xsd">
<bar/>
<foo/></root>
bool(true)
尝试使用 schemaValidate 方法根据架构验证 PHP DOMDocument 对象时,将生成下一个警告:
Warning: DOMDocument::schemaValidate(): Element 'foo': This element is not expected. Expected is ( {http://www.example.com}foo ). in X on line Y
它只发生在附加到 DOMDocument 的元素上。我准备了下一个代码片段和架构,以便任何人都可以立即进行测试:
片段:
$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 和 bar 之间的区别,除了 foo 是用 appendChild 方法添加的,而 bar 添加是用 loadXML 方法添加的。
验证返回 false(这意味着验证错误)。当使用 loadXML 方法加载 foo 时,错误停止发生,但这绝对不是解决方案,因为在很多情况下需要动态创建 XML。
¿为什么附加元素会产生此验证错误以及如何解决?
您创建的元素 <foo>
是 "missing" 命名空间,因此在空命名空间中。
命名空间也是您在错误消息中的大括号(或尖括号)中看到的部分:
{http://www.example.com}foo
`----------------------´`-´
namespace name
而不是 createElement
使用 createElementNS
并在元素名称旁边提供命名空间。
当您将创建的文档另存为 XML(例如通过查看手动验证它)时,您完全正确地认为元素 似乎 喜欢 <bar>
:
<?xml version="1.0"?>
<root xmlns="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com schema.xsd">
<bar/>
<foo/></root>
但是它刚刚被添加到那里,它是 null namspace(因此插入时周围没有太多命名空间)并且在内存中该元素仍然没有命名空间 - 并且验证在内存中。
这是一个完整的验证示例:
<?php
/**
* Element 'foo': This element is not expected. Expected is ( {http://www.example.com}foo )
*
* @link
*/
$template = <<<XML
<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>
XML;
$schema = <<<XML
<?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>
XML;
$schema = 'data://text/xml;base64,' . base64_encode($schema);
$namespace = 'http://www.example.com';
$doc = new DOMDocument();
$doc->loadXML($template);
$foo = $doc->createElementNS($namespace, 'foo');
$doc->documentElement->appendChild($foo);
echo $doc->saveXML();
var_dump($doc->schemaValidate($schema));
输出为:
<?xml version="1.0"?>
<root xmlns="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.com schema.xsd">
<bar/>
<foo/></root>
bool(true)