为什么当maxInclusive有25个或更多数字时,Libxml说无效模式?

问题描述:

无论是25位是小数和整数或只是整数,DOMDocument::schemaValidate()触发一个警告,返回false,并libxml_get_errors();捕捉下一个错误:为什么当maxInclusive有25个或更多数字时,Libxml说无效模式?

PHP代码片段:

$DD = new DOMDocument('1.0', 'ISO-8859-1'); 
$DD -> loadXML('<?xml version ="1.0" encoding="ISO-8859-1"?><a></a>'); 
libxml_use_internal_errors(true); 
$old_libxml_disable_entity_loader = libxml_disable_entity_loader(false); 
$DD -> schemaValidate(__DIR__ . '/schemas/schema.xsd'); // WARNING 
libxml_disable_entity_loader($old_libxml_disable_entity_loader); 
$errors = libxml_get_errors(); 

foreach ($errors as $error) { // PRINT ERRORS 
    echo $error -> code . '<br>'; 
    echo $error -> message . '<br>'; 
} 

DOMDocument::schemaValidate()产生了错误:

错误1824:

元素'{http://www.w3.org/2001/XMLSchema} maxInclusive': '9999999999999999999999999'不是 原子类型'xs:decimal'的有效值。在上线X /path/schema.xsd

错误1717:

元素 '{} http://www.w3.org/2001/XMLSchema maxInclusive,便会':该值 '9999999999999999999999999' 小面不验证 靠基部类型的'十进制'。在 /path/schema.xsd线X

有效的模式(无效的XML只):

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xs:schema 
    targetNamespace="http://www.lala.com/la" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:la="http://www.lala.com/la" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:simpleType name="AmountType"> 
     <xs:restriction base="xs:decimal"> 
      <xs:totalDigits value="100"/> 
      <xs:fractionDigits value="20"/> 
      <xs:maxInclusive value="999999999999999999999999"/><!-- 24 DIGITS --> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

无效模式:无效模式的警告+ xml库[Libxml内部错误

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xs:schema 
    targetNamespace="http://www.lala.com/la" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:la="http://www.lala.com/la" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:simpleType name="AmountType"> 
     <xs:restriction base="xs:decimal"> 
      <xs:totalDigits value="100"/> 
      <xs:fractionDigits value="20"/> 
      <xs:maxInclusive value="9999999999999999999999999"/><!-- 25 DIGITS --> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

PHP版本: 5.5.20

xml库[Libxml版本: 2.9.2

据​​,libxml2的可以限制maxInclusive的范围内,因为它允许限制xs:decimal价值空间的范围...

4.3.7 maxInclusive:

[定义:] maxInclusive,便会是·包容上限·的 ·值空间·用于数据类型与·有序的属性。 maxInclusive·必须位于·base类型的·value空间中。

3.2.3 decimal

注意:所有·最低限度满足要求·处理器·必须·支持十进制数 用最少的18位十进制数字(即,具有 ·totalDigits 18·)。但是,·最低限度符合·处理器·可能· 为它们准备支持的最大小数位数 设置一个应用程序定义的限制,在这种情况下,必须清楚地记录应用程序定义的最大数量· 。

+1

的确,刚刚在这里找到它:它限制为24:http://search.cpan.org/dist/XML-LibXML/lib/XML/LibXML/Schema.pod – mikl