0
나는이 스키마가 :XML 스키마 PHP를 검증 진수 오류
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="errorType">
<xs:restriction base="xs:decimal">
<xs:totalDigits value="28"/>
<xs:fractionDigits value="16"/>
<xs:minExclusive value="0"/>
<xs:maxExclusive value="1000000000000"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="TEST">
<xs:complexType>
<xs:sequence>
<xs:element name="newElement" type="errorType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
을 그리고이 XML이 : 내가 소수점 숫자에 오류가 PHP DOMDocument를 인 schemaValidate 기능을 사용하여 검증 경우
<?xml version="1.0" encoding="UTF-8"?>
<TEST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<newElement>123456789012.5000000000000003</newElement>
<newElement>12345678901.5000000000000003</newElement>
<newElement>1234567890.5000000000000003</newElement>
<newElement>123456789.5000000000000003</newElement>
<newElement>123456789.123456789</newElement>
<newElement>123456789.500000000000003</newElement>
<newElement>1234567890.500000000000003</newElement>
<newElement>12345678901.500000000000003</newElement>
<newElement>123456789012.50000000000003</newElement>
</TEST>
을 총 27 자리를 초과합니다. 이 문제를 극복 할 수있는 방법이 있습니까?
전체 코드 :
는<?php
function libxml_display_error($error)
{
$return = "<br/>\n";
switch ($error->level) {
case LIBXML_ERR_WARNING:
$return .= "<b>WARNING:</b> $error->message ";
break;
case LIBXML_ERR_ERROR:
$return .= "<b>ERROR:</b> $error->message ";
break;
case LIBXML_ERR_FATAL:
$return .= "<b>FATAL:</b> $error->message ";
break;
}
$return .= " on line <b>$error->line</b>\n";
return $return;
}
function libxml_display_errors() {
$errors = libxml_get_errors();
foreach ($errors as $error) {
print libxml_display_error($error);
}
libxml_clear_errors();
}
$xsd = '<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="errorType">
<xs:restriction base="xs:decimal">
<xs:totalDigits value="28"/>
<xs:fractionDigits value="16"/>
<xs:minExclusive value="0"/>
<xs:maxExclusive value="1000000000000"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="TEST">
<xs:complexType>
<xs:sequence>
<xs:element name="newElement" type="errorType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>';
$xml ='<?xml version="1.0" encoding="UTF-8"?><TEST xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<newElement>123456789012.5000000000000003</newElement>
<newElement>12345678901.5000000000000003</newElement>
<newElement>1234567890.5000000000000003</newElement>
<newElement>123456789.5000000000000003</newElement>
<newElement>123456789.123456789</newElement>
<newElement>123456789.500000000000003</newElement> <!-- VALID -->
<newElement>1234567890.500000000000003</newElement>
<newElement>12345678901.500000000000003</newElement>
<newElement>123456789012.50000000000003</newElement>
</TEST>
';
libxml_use_internal_errors(true);
$xmlObj = new DOMDocument();
$xmlObj->loadXML($xml);
$xmlObj->schemaValidateSource($xsd) ;
print_r (libxml_display_errors());
오류는 스키마 선언에 없지만 PHP에서는 십진수를 처리 할 때 상위 코드를 사용하십시오. – dfilkovi
읽어주세요 ... 나는 b) 제한보다 작은 수를 썼다. –
round() 함수를 사용하여 원하는 길이의 숫자를 얻는다. –