【问题标题】:XML validation: No matching global declaration available for the validation rootXML 验证:没有可用于验证根的匹配全局声明
【发布时间】:2014-08-14 14:18:41
【问题描述】:

我创建了一个 XML 文件,但是当我尝试针对 XSD 进行验证时,我不断收到以下错误:

错误 1845:元素 '{http://www.stormware.cz/schema/version_2/data.xsd}数据包': 没有可用于验证根的匹配全局声明。

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/schema/version_2/data.xsd

我的 XML 文件:

 <?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>

【问题讨论】:

    标签: php xml xsd libxml2


    【解决方案1】:

    如果您的架构是基于 www.stormware.cz/schema/version_2/data.xsd 的架构文档的架构,那么您为什么要使用表达式 $tempDom-&gt;schemaValidate('order.xsd') 进行验证?

    如果(在局外人看来)您指向的“order.xsd”是http://www.stormware.cz/schema/version_2/order.xsd(或它的副本),那么您的代码并不指向您所说的架构文档,而是到不同的架构文档,该文档描述了未声明元素 {http://www.stormware.cz/schema/version_2/data.xsd}dataPack 的架构。 (这就是错误消息告诉您的内容。)

    如果您希望架构验证器根据 dataPack 元素的声明验证您的输入,您必须确保架构包含该元素的声明。

    (你的两个cmets对我来说毫无意义。

    您说指向“order.xsd”是“根据规范”。这意味着什么?如果您应该针对植根于 .../order.xsd 的架构编写有效的东西,为什么要使用未在该架构中声明的元素(以及为什么要说您的架构位于 http://www.stormware.cz/schema/version_2/data.xsd?这根本不是同一个架构,只要看一眼相关文档就会发现。

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

    无论如何,对您的明显问题(“出了什么问题?”)的简短回答是,您没有成功地指向您打算使用的架构。修复它,您的错误消息就会消失。

    【讨论】:

    • 这是根据规范
    • 如果我更改 $tempDom->schemaValidate('data.xsd') 错误 1772:XML 文档 'C:\www\xxxxx\data.xsd' 不是模式文档。在第 0 行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2021-02-26
    • 2013-02-16
    相关资源
    最近更新 更多