PHP -> 如何检查一个 XML 是否为空

9

我从一个特定的ID请求中获取简单的XML内容。但有时候这个ID不再可用,XML就是空的。

我该如何使用PHP检查一个XML是否为空?

如果有人有想法,我将不胜感激。

提前致谢。

马可


1
你说它是空的是什么意思? 你可以将其与空字符串进行比较,如 $xml == "" 吗? 或者使用 xml 类来检查它是否有“子元素”。 - Ofir Baruch
如果是文件,你可以检查文件大小。 - aurbano
据我理解,XML文件可以有内容,但XML文档仍然为空;例如,当只有一个<?xml version="1.0"?>或一个空的根元素时。因此,Ofir Baruch的问题是:如果XML文档为空,OP如何定义“空”? - feeela
5个回答

13
如果你能使用SimpleXML扩展的话:
$xmlObject = new SimpleXMLElement($xmlText);
if ($xmlObject->count() == 0) {
    //it's empty
}
else {
    //XML object has children
}

此外,SimpleXML是一个非常方便的XML阅读器/编辑器。
详情请参考:https://www.php.net/manual/zh/book.simplexml.php

如果你想知道一个子节点是否为空,这个解决方案是不适合的。例如 <a>123</a><b/> 都计数为0。 - Jonas Äppelgran

8

我想这取决于您对“空”的定义,如果整个文档为空,您可以使用以下代码检查文档的字符串版本是否为空:

if (empty($xmlString)) 
{
    // is empty 
}

但如果您期望的是根节点,您可能需要检查是否有任何子节点:

$xml = simplexml_load_file("test.xml");

if (empty($xml->getName()) && count($xml->children()) == 0) { 
    // is empty
}

希望这能帮到您。

如果返回的XML为空,仍会引发错误。这是一个更好的解决方案:https://dev59.com/42bWa4cB1Zd3GeqPXHqX#11633904 - hobailey

2

仅仅是为了在一个老问题上增加一些我的看法,但是最受欢迎的答案似乎建议使用simplexml_load_file("test.xml");,然后测试您期望的节点不为空。由于如果文件为空,这将引发警告级别错误,因此我不同意,而是用文件大小的测试来包装调用。

$xmlInfo = new SplFileInfo('test.xml');
if((int) $xmlInfo->getSize() > 0)
{
   $xml = simplexml_load_file($xmlInfo->getPath());  
}

当然,OP已经问了一个问题:“如何使用PHP检查XML是否为空”,这并没有说明他是指节点还是文件,但为了完整起见,这里提供一下。

2

只需要在你的id前面加上(string)就可以了。

例如:

你的代码是这样的

$id = $xml->mail->id;

然后改成这样

$id = (string)$xml->mail->id;

就可以了。


1

Try This:

$xml_str = '<?xml version="1.0" standalone="yes"?><Name/>';
$xml = new SimpleXMLElement($xml_str);

if(empty($xml->Name[0])){
    // ITS EMPTY !! DO SOMETHING
    echo "ITS EMPTY ASJK";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接