簡體   English   中英

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

如果您的模式是植根於www.stormware.cz/schema/version_2/data.xsd的模式文檔的模式,那么為什么要使用表達式$tempDom->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元素的聲明來驗證輸入,則必須確保模式包含該元素的聲明。

(您的兩條評論對我來說毫無意義。

您說指向“ order.xsd”是“根據規范”。 這意味着什么? 如果您應該針對以... / order.xsd為根的模式編寫有效的內容,那么為什么要使用該模式中未聲明的元素(為什么要說您的模式位於http://, www.stormware.cz/schema/version_2/data.xsd ?這根本不是同一模式,因為只要一看相關文件就會發現。

您還說指向文件系統中的特定位置會導致顯示一條錯誤消息,提示該位置的文件不是架構文檔。 http://www.stormware.cz/schema/version_2/data.xsd 的資源模式文檔。 一個明顯的猜測是您要么錯誤的找到了文件位置路徑,要么應該在相對的適當位置擁有所有相關架構文檔的副本,而您卻沒有。)

無論如何,對您的明顯問題(“怎么了?”)的簡短回答是,您沒有成功指向您要使用的架構。 解決該問題,您的錯誤消息將消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM