11

Web サイト用に 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>
4

5 に答える 5

22

残念ながら、私の場合、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でもテスト目的で問題なく動作します。

于 2015-05-05T16:37:20.197 に答える
2

PHP ドキュメントには、まさに必要なものが含まれています。

XML DOMDocument::validate

適切な DTD を既に定義していると思いますよね?

<?php
$dom = new DOMDocument;
$dom->Load('book.xml');
if ($dom->validate()) {
    echo "This document is valid!\n";
}
?>
于 2013-06-19T13:03:47.037 に答える
0

使用できますXMLReader::isValid()

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

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

    var_dump($xml->isValid());
?>
于 2013-06-19T13:03:07.560 に答える
-2

PHP関数を使用できます:-

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

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

var_dump($xmlcontents->isValid());

ソース:- http://php.net/manual/en/xmlreader.isvalid.php

于 2013-06-19T13:04:01.717 に答える