當試圖通過使用schemaValidate方法以驗證針對模式的PHP DOMDocument對象,正在生成下一個警告:元素'foo':該元素不是預期的。預期是({http://www.example.com}富)
警告:DOM文檔:: schemaValidate():元素'foo':該元素不爲 。預期是({foo})。在X上 行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之外,還添加了appendChild方法,而添加了loadXML方法的bar。
驗證返回false(這意味着驗證錯誤)。當使用loadXML方法加載foo時,錯誤停止發生,但這肯定不是解決方案,因爲在很多情況下需要動態創建XML。
¿爲什麼追加元素會產生這個驗證錯誤以及如何解決?
我沒有注意到,因爲只使用默認的命名空間。但是,謝謝,不知道在這種情況下指定命名空間是很有必要的。 – mikl
是的,關於從查看XML中看不到的部分(我在回答的第一個修訂版中遇到了這個簡短和錯誤),我添加了一個更好的解釋(希望!)。我還放置了一個代碼示例來展示它的實際應用。 – hakre