正则表达式的XSD架构验证错误

时间:2012-02-07 16:26:38

标签: xml xsd

当我尝试使用包含常规的XSD架构验证XML文件时 表达式,函数DOMDocument :: schemaValidate返回验证错误。

  • 模式'^ [A-Za-z] {2} $'不接受值'RU'。
  • 模式'^ [0-9] {4} $'不接受值'6258'。
  • 模式'^ [A-Za-z] \ d [A-Za-z] \ d [A-Za-z] \ d $'不接受值'G9N3T5'。

但是当我比较值和正则表达式时,它应该没问题。

这是我的XSD的一部分:

 <xsd:complexType>
    <xsd:sequence>
       <xsd:element name="RL0201Ex" type="CODE_POSTAL" minOccurs="0" maxOccurs="1">
          <xsd:annotation>
             <xsd:documentation>
                Code postal de l'adresse postale
             </xsd:documentation>
          </xsd:annotation>
       </xsd:element>
    </xsd:sequence>
 </xsd:complexType>



<xs:simpleType name="CODE_POSTAL">
   <xs:restriction base="xs:string">
      <xs:pattern value="^[A-Za-z]\d[A-Za-z]\d[A-Za-z]\d$" />
   </xs:restriction>
</xs:simpleType>

我的PHP代码:

function libxml_display_error($error) {

    $return = "<br/>\n";
    $return .= "<b>Erreur ligne $error->line</b> : ";
    $return .= trim($error->message);
    $return .= "\n";

    return $return;
}

function libxml_display_errors($display_errors = true) {
    $errors = libxml_get_errors();
    $chain_errors = "";

    foreach ($errors as $error) {
        if ($error->code == "1839") {
            $chain_errors .= preg_replace('/( in\ \/(.*))/', '',     strip_tags(libxml_display_error($error)))."\n";
            if ($display_errors) {
                    echo(libxml_display_error($error));
            }
        }
    }
    libxml_clear_errors();

    return $chain_errors;
}

libxml_use_internal_errors(true);

$file   = "informations.xml";
$schema = "informations.xsd";

$dom = new DOMDocument("1.0");
$dom->load($file);

$validate = $dom->schemaValidate($schema);
if ($validate) {
   echo "<b>DOMDocument::schemaValidate() Valid schema !</b>";
} 
else {
   echo "<b>DOMDocument::schemaValidate() Generated Errors !</b><br /><br />";
   libxml_display_errors();
}

谢谢

1 个答案:

答案 0 :(得分:3)

在XSD正则表达式方言中,'$'是一个普通字符,而不是匹配'$'符号,而不是字符串的结尾。你不需要任何东西来匹配字符串的结尾 - 正则表达式隐含地锚定在字符串的两端。