使用 php 针对 xsd 验证 xml 文件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11650377/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 01:47:52  来源:igfitidea点击:

validate a xml file against a xsd using php

phpxmlvalidationxsdxml-parsing

提问by varuog

how to validate a xml file against a xsd? there is domdocument::schemaValidate() but It does not tell where are the errors. is there any class for that? does it have any worth making that parser from scratch? or is it just reinventing he wheel,

如何针对 xsd 验证 xml 文件?有 domdocument::schemaValidate() 但它没有说明错误在哪里。有什么课吗?从头开始制作解析器有什么价值吗?或者只是重新发明轮子,

回答by Ed Heal

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.phpTo retrieve the errors.

查看http://php.net/manual/en/domdocument.schemavalidate.php 中的代码来检索错误。

I.e.

IE

justin at redwiredesign dot com 08-Nov-2006 03:32 post.

贾斯汀在 redwiredesign dot com 2006 年 11 月 8 日 03:32 发表。

回答by Maciej Niemir

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. See http://php.net/manual/en/ref.libxml.phpfor more info.

有关 DOMDocument::schemaValidate 的更详细反馈,请禁用 libxml 错误并自行获取错误信息。有关更多信息,请参阅 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();
}

?>

回答by Sebastian Viereck

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();
    }