简体   繁体   English

使用 php 针对 xsd 验证 xml 文件

[英]validate a xml file against a xsd using php

how to validate a xml file against a xsd?如何根据 xsd 验证 xml 文件? there is domdocument::schemaValidate() but It does not tell where are the errors.有 domdocument::schemaValidate() 但它没有告诉错误在哪里。 is there any class for that?有什么课程吗? does it have any worth making that parser from scratch?从头开始制作该解析器是否值得? or is it just reinventing he wheel,或者只是重新发明他的轮子,

This code does the business:此代码执行以下操作:

$xml= new DOMDocument();
$xml->loadXML(<A string goes here containing the XML data>, LIBXML_NOBLANKS); // Or load if filename required
if (!$xml->schemaValidate(<file name for the XSD file>)) // Or schemaValidateSource if string used.
{
   // You have an error in the XML file
}

See the code in http://php.net/manual/en/domdocument.schemavalidate.php To retrieve the errors.请参阅http://php.net/manual/en/domdocument.schemavalidate.php中的代码以检索错误。

Ie IE

justin at redwiredesign dot com 08-Nov-2006 03:32 post.贾斯汀在 redwiredesign.com 2006 年 11 月 8 日 03:32 发布。

User contrib from http://php.net/manual/en/domdocument.schemavalidate.php来自http://php.net/manual/en/domdocument.schemavalidate.php的用户贡献

It works like a charm!它就像一个魅力!

For more detailed feedback from DOMDocument::schemaValidate, disable libxml errors and fetch error information yourself.如需来自 DOMDocument::schemaValidate 的更详细反馈,请禁用 libxml 错误并自行获取错误信息。 See http://php.net/manual/en/ref.libxml.php for more info.有关详细信息,请参阅http://php.net/manual/en/ref.libxml.php

example.xml例子.xml

<?xml version="1.0"?>
<example>
    <child_string>This is an example.</child_string>
    <child_integer>Error condition.</child_integer>
</example>

example.xsd例子.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
    <xs:element name="example">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="child_string" type="xs:string"/>
                <xs:element name="child_integer" type="xs:integer"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

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 libxml_display_errors() {
    $errors = libxml_get_errors();
    foreach ($errors as $error) {
        print libxml_display_error($error);
    }
    libxml_clear_errors();
}

// Enable user error handling
libxml_use_internal_errors(true);

$xml = new DOMDocument();
$xml->load('example.xml');

if (!$xml->schemaValidate('example.xsd')) {
    print '<b>DOMDocument::schemaValidate() Generated Errors!</b>';
    libxml_display_errors();
}

?>

This is a complete code snippet for displaying xsd validation errors:这是显示 xsd 验证错误的完整代码片段:

    $xml = '<test/>';
    $xsd = '/path/to/xsd';
    // needed for getting errors
    libxml_use_internal_errors(true);

    $domDocument= new DOMDocument();
    $domDocument->loadXML($xml); 
    if (!$domDocument->schemaValidate($xsd)) {
        $errors = libxml_get_errors();
        foreach ($errors as $error) {
            print_r($error);
        }
        libxml_clear_errors();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM