XML验证:验证根没有匹配的全局声明


XML validation: No matching global declaration available for the validation root

我创建了一个XML文件,但是当我试图对XSD进行验证时,我一直得到以下错误:

错误1845:元素"{http://www.stormware.cz/schema/version_2/data.xsd} dataPack":验证根没有匹配的全局声明。

PHP 5.4.7 . libxml 2.7.8.

我的函数:

public function validateXml($dokument){
    // Enable user error handling
    libxml_use_internal_errors(true);
    $xml = new DOMDocument();
    $xml->load($dokument);
    $tempFile = time() . '-' . rand() . '-document.tmp';
    $xml->save($tempFile);
    $tempDom = new DOMDocument();
    $tempDom->load($tempFile);
    // Delete temporary file.
    if (is_file($tempFile))
    {
        unlink($tempFile);
    }

    if (!$tempDom->schemaValidate('order.xsd')) {
        print '<b>DOMDocument::schemaValidate() Generated Errors!</b>';
        $this->libxml_display_errors();
    }
}
我的XSD文件:www.stormware.cz/模式/version_2/data.xsd

My XML file:

 <?xml version="1.0" encoding="Windows-1250"?> 
<dat:dataPack id="ob001" ico="12345678" application="StwTest" version = "2.0" note="Import Objednávky" 
xmlns:dat="http://www.stormware.cz/schema/version_2/data.xsd" 
xmlns:ord="http://www.stormware.cz/schema/version_2/order.xsd" 
xmlns:typ="http://www.stormware.cz/schema/version_2/type.xsd" >

<dat:dataPackItem id="OBJ001" version="2.0">

<ord:order version="2.0"> 
<!--prijata objednavka s polozkama--> 
<ord:orderHeader> 
<ord:orderType>receivedOrder</ord:orderType> 
<ord:numberOrder>20140505A001</ord:numberOrder> 
<ord:date>2014-10-14</ord:date> 
<ord:dateFrom>2014-10-14</ord:dateFrom> 
<ord:dateTo>2014-10-14</ord:dateTo> 
<ord:text>Objednáváme u Vás zboží dle ústní dohody</ord:text> 
<ord:partnerIdentity> 
<typ:address> 
<typ:company>Otma a.s.</typ:company> 
<typ:division>Obchodní oddělení</typ:division> 
<typ:name>Petr Novák</typ:name> 
<typ:city>Brno</typ:city> 
<typ:street>Nová 15</typ:street> 
<typ:zip>61900</typ:zip> 
<typ:ico>789456</typ:ico> 
<typ:dic>CZ789456</typ:dic> 
</typ:address> 
</ord:partnerIdentity> 
<ord:paymentType> 
<typ:ids>hotově</typ:ids> 
</ord:paymentType> 
<ord:priceLevel> 
<typ:ids>Sleva 1</typ:ids> 
</ord:priceLevel> 
</ord:orderHeader>

<ord:orderDetail> 
<!--textova polozka--> 
<ord:orderItem> 
<ord:text>Sestava PC</ord:text> 
<ord:quantity>1</ord:quantity> 
<ord:delivered>0</ord:delivered> 
<ord:rateVAT>high</ord:rateVAT> 
<ord:homeCurrency> 
<typ:unitPrice>200</typ:unitPrice> 
</ord:homeCurrency> 
</ord:orderItem>

<!--skladova polozka--> 
<ord:orderItem> 
<ord:quantity>1</ord:quantity> 
<ord:delivered>0</ord:delivered> 
<ord:rateVAT>high</ord:rateVAT> 
<ord:homeCurrency> 
<typ:unitPrice>198</typ:unitPrice> 
</ord:homeCurrency> 
<ord:stockItem> 
<typ:stockItem> 
<typ:ids>STM</typ:ids> 
</typ:stockItem> 
</ord:stockItem> 
</ord:orderItem> 
</ord:orderDetail>

<ord:orderSummary> 
<ord:roundingDocument>math2one</ord:roundingDocument> 
</ord:orderSummary>

</ord:order>

</dat:dataPackItem>

</dat:dataPack>

如果您的模式是扎根于www.stormware.cz/schema/version_2/data.xsd上的模式文档中的模式,那么为什么要使用表达式$tempDom->schemaValidate('order.xsd')进行验证呢?

如果(在外人看来)是"顺序"。如果您指向的是http://www.stormware.cz/schema/version_2/order.xsd(或它的副本),那么您的代码就不是指向您所说的模式文档,而是指向另一个模式文档,该文档描述了一个没有声明元素{http://www.stormware.cz/schema/version_2/data.xsd}dataPack的模式。(这是错误信息告诉你的)

如果您希望一个模式验证器根据dataPack元素的声明来验证您的输入,您必须确保模式包含该元素的声明。

你的两个评论对我来说毫无意义。

你说的是指"秩序"。Xsd '表示"根据规格"。这是什么意思?如果您要针对根植于…/order的模式编写有效的内容。Xsd,为什么要使用没有在该模式中声明的元素(为什么要说模式位于http://www.stormware.cz/schema/version_2/data.xsd) ?只要浏览一下相关文档就会发现,这根本不是同一个模式。

您还说,指向文件系统中的特定位置会导致一条错误消息,抱怨该位置的文件不是模式文档。http://www.stormware.cz/schema/version_2/data.xsd 上的资源是一个模式文档;一个明显的猜测是,您要么把文件位置路径搞错了,要么您应该在相对于彼此的适当位置拥有所有相关模式文档的副本,而您没有。

在任何情况下,对你明显的问题("哪里出错了?")的简短回答是,你没有成功地指出你说你打算使用的模式。