如何用php验证xml

时间:2013-06-19 13:00:22

标签: php xml xml-validation

我已根据基于xml的请求为我的网站制作了api。

但有时候,有些客户发给我一个无效的xml,我想回复一个好的回复。

如何验证xml?

编辑:

好吧,我想我提出了错误的问题,我想验证节点,如果某些节点丢失,那么我会返回最佳响应。

我曾经用php验证这一点,我必须检查每个节点。 但这种方式很难修改。

这是我的xml示例:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<mashhadhost>
    <create>
        <name>example.ir</name>
        <period>60</period>
        <ns>
            <hostAttr>
                <hostName>ns1.example.ir</hostName>
                <hostAddr ip="v4">192.0.2.2</hostAddr>
            </hostAttr>
        </ns>
        <contact type="holder">ex61-irnic</contact>
        <contact type="admin">ex61-irnic</contact>
        <contact type="tech">ex61-irnic</contact>
        <contact type="bill">ex61-irnic</contact>
    </create>
    <auth>
        <code>TOKEN</code>
    </auth>
</mashhadhost>

5 个答案:

答案 0 :(得分:15)

不幸的是,XMLReader在我的案例中没有验证很多东西。

这是我前一段时间写的一小段课:

/**
 * Class XmlValidator
 * @author Francesco Casula <fra.casula@gmail.com>
 */
class XmlValidator
{
    /**
     * @param string $xmlFilename Path to the XML file
     * @param string $version 1.0
     * @param string $encoding utf-8
     * @return bool
     */
    public function isXMLFileValid($xmlFilename, $version = '1.0', $encoding = 'utf-8')
    {
        $xmlContent = file_get_contents($xmlFilename);
        return $this->isXMLContentValid($xmlContent, $version, $encoding);
    }

    /**
     * @param string $xmlContent A well-formed XML string
     * @param string $version 1.0
     * @param string $encoding utf-8
     * @return bool
     */
    public function isXMLContentValid($xmlContent, $version = '1.0', $encoding = 'utf-8')
    {
        if (trim($xmlContent) == '') {
            return false;
        }

        libxml_use_internal_errors(true);

        $doc = new DOMDocument($version, $encoding);
        $doc->loadXML($xmlContent);

        $errors = libxml_get_errors();
        libxml_clear_errors();

        return empty($errors);
    }
}

它适用于流和vfsStream以及测试目的。

答案 1 :(得分:2)

如果您只想检查文档是否格式正确(您不关心DTD有效性,甚至没有要验证的DTD),请使用Domdocument验证您的文件,而不是XMLReader,因为XMLReader将流式传输您的文档而不会立即加载它,因此isValid()方法只会检查第一个节点。您可以尝试这样的代码:

 $doc = new \DOMDocument();

 if(@$doc->load($filePath)){
     var_dump("$filePath is a valid XML document");
} else {
      var_dump("$filePath is NOT a valid document");
}

答案 2 :(得分:0)

您可以使用XMLReader::isValid()

<?php
    $xml = XMLReader::open('xmlfile.xml');

    // You must to use it
    $xml->setParserProperty(XMLReader::VALIDATE, true);

    var_dump($xml->isValid());
?>

答案 3 :(得分:0)

PHP文档正是您所需要的!

XML DOMDocument::validate

我确定您已经定义了正确的DTD,对吗?

<?php
$dom = new DOMDocument;
$dom->Load('book.xml');
if ($dom->validate()) {
    echo "This document is valid!\n";
}
?>

答案 4 :(得分:-2)

您可以使用PHP功能: -

$xmlcontents = XMLReader::open('filename.xml');

$xmlcontents->setParserProperty(XMLReader::VALIDATE, true);

var_dump($xmlcontents->isValid());

来源: - http://php.net/manual/en/xmlreader.isvalid.php