对SimpleXMLElement的getName()调用返回致命错误“对非对象的成员函数调用”

时间:2013-02-04 00:56:44

标签: php simplexml

我遇到了一个非常奇怪的错误。我正在编写一个函数来根据元素名称验证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新手,所以非常感谢帮助!

P.S。要明确到底发生了什么,请使用以下代码:

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)

...所以它似乎有效,除了致命的错误仍然被抛出。

1 个答案:

答案 0 :(得分:1)

$xml为无效XML时,您的代码(假设它与您在问题中写的内容足够接近)将会失败,因为simplexml_load_string()

  

返回类SimpleXMLElement的对象,其属性包含xml文档中保存的数据,或失败时为FALSE

如果您仍然没有看到这一点,我建议您使用if语句而不是使用第三语句来重写代码。当$xml不是SimpleXMLElement实例,DOMDocument实例时,您的功能将有效地归结为以下功能:

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