0

非常に奇妙なエラーが発生しています。要素名に基づいて XML を検証する関数を作成しています。この場合は配列として渡されます。まず、入力をSimpleXMLElementオブジェクトに正規化します。この場合、DOMDocument を渡しています。テストしたところ、正しく変換されていSimpleXMLElementます。

私を混乱させるのは、呼び出しgetName()が次をスローすることです:

PHP Fatal error:  Call to a member function getName() on a non-object

しかし、exit($xml->getName())(またはecho) を使用すると正しい結果が返されます - ルート要素名です!

関連コード:

function validateXML($xml, $format='') {
(get_class($xml) !== 'SimpleXMLElement') ?
    ((get_class($xml) === 'DOMDocument') ?
        $xml = simplexml_import_dom($xml)
        : $xml = simplexml_load_string($xml))
    : $xml = $xml;
$rootName = ($xml->getName());
if ($rootName != $format[0]) {
    exit($xml->getName())));
}

また、問題が発生した場合、サーバーはPHP 5.3を実行しています

私はPHPに非常に慣れていないので、助けていただければ幸いです!

PS正確に何が起こっているのかを明確にするために、次のコード:

function validateXML($xml, $format='') {
    echo(get_class($xml);
    $xml = simplexml_import_dom($xml);
    echo(get_class($xml);
    echo($xml->getName());
}

サーバーへの出力

DOMDocument
SimpleXMLElement
'ElementName' (the correct root name of my XML document)

...致命的なエラーがまだスローされることを除いて、動作しているように見えます。

4

1 に答える 1

1

あなたのコード (質問で書いたものに十分近いと仮定して)$xmlが無効な XML の場合、次の理由により失敗しsimplexml_load_string()ます。

xml ドキュメント内に保持されているデータを含むプロパティを持つクラス SimpleXMLElement のオブジェクトを返します。失敗した場合は FALSE を返します。

それでもこれが表示されない場合はif、3 次ステートメントの代わりにステートメントを使用してコードを書き直すことをお勧めします。インスタンスでもインスタンスでも$xmlない場合、関数は事実上次の関数になります。SimpleXMLElementDOMDocument

function validateXML($xml, $format='') {
    simplexml_load_string($xml);
    $rootName = ($xml->getName());
    if ($rootName != $format[0]) {
        exit($xml->getName());
    };
}
于 2013-02-04T01:01:50.420 に答える