我有我想驗證的這種XML產品。使用XSD進行XML驗證
(我把它放在xml.xml文件)
<?xml version="1.0" encoding="UTF-8"?>
<catalog label="global">
<catalog label="animals" link="/animals.php">
<subject>Subject1</subject>
</catalog>
<catalog label="animals" link="/animals.php">
<subject>Subject2</subject>
</catalog>
</catalog>
生成的XSD與this tool:(我把文件xml.xsd)
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="catalog" type="catalogType" />
<xsd:complexType name="catalogType">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" name="catalog" type="catalogType" />
</xsd:sequence>
<xsd:attribute name="label" type="xsd:string" />
</xsd:complexType>
<xsd:complexType name="catalogType">
<xsd:sequence>
<xsd:element name="subject" type="xsd:string" />
</xsd:sequence>
<xsd:attribute name="label" type="xsd:string" />
<xsd:attribute name="link" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
和我使用的PHP代碼測試它們(在php.php文件):
<?php
function libxml_display_error($error)
{
$return = "<br/>\n";
switch ($error->level) {
case LIBXML_ERR_WARNING:
$return .= "<b>Warning $error->code</b>: ";
break;
case LIBXML_ERR_ERROR:
$return .= "<b>Error $error->code</b>: ";
break;
case LIBXML_ERR_FATAL:
$return .= "<b>Fatal Error $error->code</b>: ";
break;
}
$return .= trim($error->message);
if ($error->file) {
$return .= " in <b>$error->file</b>";
}
$return .= " on line <b>$error->line</b>\n";
return $return;
}
function checkXMLStructure($xml_object)
{
$xmlElement = $xml_object->catalog;
$dom_sxe = dom_import_simplexml($xmlElement);
$dom = new DOMDocument('1.0');
$dom_sxe = $dom->importNode($dom_sxe, true);
$dom_sxe = $dom->appendChild($dom_sxe);
if (!$dom->schemaValidate(dirname(__FILE__) . '/xml.xsd')) {
echo "BAD XML\n";
return;
}
echo "*GOOD* XML!\n";
}
// Enable user error handling
libxml_use_internal_errors(true);
$xml_object = simplexml_load_file('xml.xml');
checkXMLStructure($xml_object);
// Display Errors
$errors = libxml_get_errors();
foreach ($errors as $error) {
print libxml_display_error($error);
}
libxml_clear_errors();
輸出:
PHP Warning: DOMDocument::schemaValidate(): Element '{http://www.w3.org/2001/XMLSchema}complexType': A global complex type definition 'catalogType' does already exist. in /path/php.php on line 13
PHP Stack trace:
PHP 1. {main}() /path/php.php:0
PHP 2. checkXMLStructure() /path/php.php:23
PHP 3. DOMDocument->schemaValidate() /path/php.php:13
PHP Warning: DOMDocument::schemaValidate(): Invalid Schema in /path/php.php on line 13
PHP Stack trace:
PHP 1. {main}() /path/php.php:0
PHP 2. checkXMLStructure() /path/php.php:23
PHP 3. DOMDocument->schemaValidate() /path/php.php:13
BAD XML
我需要重寫模式,以便它會注意到主元素中的*許多元素(請注意相同的名稱用法)。
問題是? – 2012-03-29 20:32:31
對不起,在問題中更新。 – valk 2012-03-29 20:43:05
還是不知道問題是什麼 – eddy147 2016-07-25 13:51:54