繁体   English   中英

如何使用PHP检查XML标签是否为空?

[英]How to check if XML tag is empty using PHP?

如果我的XML文件的内容是:

<query>
    <results/>
</query>

我正在使用$obj = simplexml_load_file( $filepath )所以文件内容存储在$obj

如您所见,result标记为空,没有文本或属性。

如何检查结果标签是否为空?

我考虑过if ( empty( $obj->results ) )但是我认为这不是正确的语法。

如您所见,result标记为空,没有文本或属性。

如何检查结果标签是否为空?

在XML中,如果满足以下条件根据定义将元素视为

[定义:不包含任何内容的元素被认为是空的 。]空元素的表示形式可以是紧跟其后是结束标签的开始标签,也可以是空元素标签。 [定义: 空元素标签采用特殊形式:] [...它遵循空元素标签的定义,并在末尾带有“ />”]

因此,在XML中,无论是<results/>还是<results></results> ,都称为一个空元素。 请注意, <results foo="bar"/>也是一个空元素。 重要的是此处元素的内容,而不是属性。

因此,现在在SimpleXML中,如何查找元素是否没有内容? 这实际上很麻烦。 我宁愿依靠DOM姐妹库,这也很简单:

<?php

$buffer = <<<XML
<query>
    <results/>
    <results></results>
</query>
XML;

$xml = simplexml_load_string($buffer);

$element = $xml->results[0];
var_dump(dom_import_simplexml($element)->childNodes->length);

$element = $xml->results[1];
var_dump(dom_import_simplexml($element)->childNodes->length);

本示例仅将$buffer的小XML文档与SimpleXML解析为$xml 然后,通过SimpleXML的DOM姐妹库检查第一个和第二个results元素的子代数。 如果子代数为零,则元素为空。

$isEmpty = !dom_import_simplexml($element)->childNodes->length;

使用“纯” SimpleXML,由于模型有限, Simple XML在此处提供的简单性使您遇到问题。 例如,SimpleXML不考虑注释,如果文本节点不是叶节点,则在访问文本节点时会遇到问题。 可以 (但绝不能像我在DOM中所示)解决xpath查询,以解决SimpleXML中的一些限制。 例如,仅在不为空的情况下匹配该元素,因此再次计数0表示为空元素:

var_dump(count($element->xpath('(.)[./node()]')));

这里的xpath

(.)[./node()]

表示:如果当前元素具有子节点,则仅获取它。 因此,查询如果不为空,则返回一个元素,如果为空,则返回零个元素。 这是一种检查SimpleXML中是否为空元素的方法。 您可以将此原理扩展为还检查属性:

(.)[./node()|./@*]

也许有点神秘。 但是要回答您的问题,那就是要走的路:

$isEmpty = !count($element->xpath('(.)[./node()|./@*]'));

即:具有零属性的空XML元素。

希望这会有所帮助,并为您到目前为止尚未探索的领域提供一些启示。


这是我在编写答案时创建的一些示例代码沙箱样式( 也可以在线尝试 ):

<?php
/**
 * How to check if XML tag is empty using PHP?
 * @link http://stackoverflow.com/a/29614074/367456
 */

$buffer = <<<XML
<query>
    <results/>
    <results afri="cloa&lt;a"/>
    <results><!-- help --></results>
    <results><!-- help -->1<test>222</test></results>
</query>
XML;

$xml = simplexml_load_string($buffer);

$element = $xml->results[0];

// $path   = '*';
// $path   = '.';
// $path   = 'self::*';
// $path   = 'self::*[1]';
// $path   = 'descendant::node()';
// $path   = 'self::*[descendant::node()]';
// $path   = '(.)[descendant::node()]';
// $path   = '(.)[.//node()]';
// $path   = '(.)[child::node()]';
$path   = '(.)[./node()]';
$result = $element->xpath($path);
var_dump(count($result));
foreach ($result as $node) {
    echo $node->asXML(), "\n";
}
echo "------\n";

var_dump(count($element->xpath('(.)[./node()]')));
var_dump(count($element->xpath('(.)[./node()|./@*]')));

var_dump(strlen($element) + $element->children()->count());


$element = $xml->results[1];
var_dump(dom_import_simplexml($element)->childNodes->length);

$dom = dom_import_simplexml($element);
$dom->appendChild($dom->ownerDocument->createTextNode(""));

var_dump($element->children()->count());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM