当maxInclusive有25位或更多位数时,为什么Libxml说无效架构?

时间:2015-10-20 19:28:29

标签: php xml xsd libxml2

25位数是小数,整数还是整数,qt触发警告,返回false,DOMDocument::schemaValidate()捕获下一个错误:

PHP代码段

libxml_get_errors();

$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>'; } 生成的错误:

错误1824:

  

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

错误1717:

  

元素'{http://www.w3.org/2001/XMLSchema} maxInclusive':值   facet的'9999999999999999999999999'无法验证   针对基本类型“{http://www.w3.org/2001/XMLSchema}十进制”。在   第X行的/path/schema.xsd

有效架构(仅限无效的XML):

DOMDocument::schemaValidate()

架构无效:警告+无效架构的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="999999999999999999999999"/><!-- 24 DIGITS -->
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

PHP版本: 5.5.20

Libxml版本: 2.9.2

1 个答案:

答案 0 :(得分:3)

根据W3C XML Schema Part 2: Datatypes Second Edition,libxml2可以限制maxInclusive的范围,因为它允许限制xs:decimal的值空间范围......

4.3.7 maxInclusive:

  

[定义:] maxInclusive 是包含上限的   ·值空间·对于具有·ordered·属性的数据类型。的价值    maxInclusive ·必须在·基类型的·值空间中·。

3.2.3 decimal

  

注意:所有·符合最低要求的处理器·必须支持十进制   至少包含18位十进制数字的数字(即带有   ·totalDigits·18)。但是,·最低限度的处理器·可能·   为最大小数设置应用程序定义的限制   他们准备支持的数字,在这种情况下   应用程序定义的最大数量·必须明确记录。