2011-09-13 2 views
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()); 

답변

2

a) 귀하가

<xs:totalDigits value="28"/> 

나 원하는대로 값이 레이블을 변경) 숫자 라운드 제한보다 작게 (아마 당신의 번호를 포함하여 29 자리입니다 소수점 이하)

그냥 스키마가 필요로하는 제한이 적용

<xs:restriction base="xs:decimal"> 
      <xs:totalDigits value="28"/> 
      <xs:fractionDigits value="16"/> 
      <xs:minExclusive value="0"/> 
      <xs:maxExclusive value="1000000000000"/> 
</xs:restriction> 
+0

오류는 스키마 선언에 없지만 PHP에서는 십진수를 처리 할 때 상위 코드를 사용하십시오. – dfilkovi

+0

읽어주세요 ... 나는 b) 제한보다 작은 수를 썼다. –

+0

round() 함수를 사용하여 원하는 길이의 숫자를 얻는다. –