当我尝试使用包含常规的XSD架构验证XML文件时 表达式,函数DOMDocument :: schemaValidate返回验证错误。
但是当我比较值和正则表达式时,它应该没问题。
这是我的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();
}
谢谢
答案 0 :(得分:3)
在XSD正则表达式方言中,'$'是一个普通字符,而不是匹配'$'符号,而不是字符串的结尾。你不需要任何东西来匹配字符串的结尾 - 正则表达式隐含地锚定在字符串的两端。