根据XML规范,这是一个空元素的定义:
没有内容的元素被认为是空的.]空元素的表示是紧跟在结束标记之后的开始标记,或者是空元素标记.
(见:http://www.w3.org/TR/REC-xml/#NT-content)
现在,我对理解空元素标签没有任何问题:<i-am-empty/>并且不存在任何误解.但在我看来,标准在另一种情况下自相矛盾:一方面,它表示任何不带标签content都是空的,另一方面它表示这可以用一个开始标记表示,然后立即结束 -标签.但是如果我们看一下这个定义content:
[43] content ::= CharData? ((element | Reference | CDSect | PI | Comment) CharData?)*
Run Code Online (Sandbox Code Playgroud)
在我看来,它content由两个可选部分CharData?和一个组组成()*.但由于这两个部分都是可选的,因此它意味着没有任何东西(如没有字符)与此产品相匹配.因此,如果我试图将这个内容的定义与内部的任何内容相匹配,<am-i-empty-or-not></am-i-empty-or-not>我将获得积极的匹配.所以,一方面这是一个空标签,因为它是"一个开始标签后紧跟一个结束标签",另一方面它不是空的,因为在标签之间我可以积极地匹配生产规则的定义[对于内容,在这种情况下它包含内容,这意味着它不能为空.
任何人都能解释哪些规则优先吗?有没有人知道任何对此有不同意见的DOM或解析器实现?
我有这个 PHP 代码:
$document = new DOMDocument();
$document->loadHTML( $html );
$xpath = new DomXPath($document);
$tables = $xpath->query("//*[contains(@class, 'info')]");
$tableDom = new DomDocument();
$tableDom->appendChild($tableDom->importNode($tables->item(0), true));
Run Code Online (Sandbox Code Playgroud)
如何检查 $tables 变量是否包含我们可以在 $tableDom 中使用的内容?
我试过:
if (!empty($tables)) {
echo("</br>not empty</br>");
} else {
echo("empty");
}
if (!$tablese) {
echo("empty</br>");
}
Run Code Online (Sandbox Code Playgroud)
但是它总是说它不是空的,所有的 HTML 都不包含带有类信息的表格。