php - 使用 PHP XMLReader 检测 XML 自闭标签

标签 php xml libxml2 xmlreader

我想使用 XMLReader 解析一个 XML 文档。我有一个带有所有常量的大小写开关。但是,如果标签是自关闭的,则 XMLReader 只会触发 ELEMENT,而不是 ELEMENT,而不是像预期的那样触发 END_ELEMENT。

通过类属性 $isEmptyElement 的检测也不起作用,因为标签具有属性。

因此我的问题是:如何在 PHP 中使用 XMLReader 检测自闭合 XML 标记?

相关但无解: XmlReader - Self-closing element does not fire a EndElement event?

示例节点:

<mynode name="somenamestring" code="intstring" option="intstring3"/>

我的代码:

$xmlReader->open($url,NULL);
$xmlWriter = new XMLWriter();
$xmlWriter->openMemory();
$xmlWriter->startDocument('1.0', 'UTF-8');
$xmlWriter->setIndent(true);
$xmlWriter->setIndentString('    ');
while ($xmlReader->read()) {
    switch ($xmlReader->nodeType) {
        case 1: #element
            $xmlWriter->startElement($xmlReader->name);
            if ($xmlReader->hasAttributes) {
                while ($xmlReader->moveToNextAttribute()) {
                    $xmlWriter->writeAttribute($xmlReader->name,$xmlReader->value);
                }
            }
            if ($xmlReader->isEmptyElement) {
                $xmlWriter->endElement();
            }
            break;

        case 3: #text
            $xmlWriter->text($xmlReader->value);
            break;

        case 4: #cdata
            $xmlWriter->writeCData($xmlReader->value);
            break;

        case 14: #whitespace
            break;

        case 15: #end element
            $xmlWriter->endElement();
            break;

        default:
            print('[WARN] NodeType not in case-switch: '.(string)$xmlReader->nodeType."\n");
            break;
    }
}

最佳答案

Detection through class property $isEmptyElement does also not work because the tag has attributes.

这是完全错误的。具有属性的空元素仍然是空的,$isEmptyElement 将反射(reflect)这一点。您的代码的问题是您在移动到属性后测试 $isEmptyElement 。这会将当前节点更改为非空元素的属性节点。像下面这样的东西应该可以工作:

        $isEmpty = $xmlReader->isEmptyElement;
        if ($xmlReader->hasAttributes) {
            while ($xmlReader->moveToNextAttribute()) {
                ...
            }
        }
        if ($isEmpty) {
            $xmlWriter->endElement();
        }

或者,或者:

        if ($xmlReader->hasAttributes) {
            while ($xmlReader->moveToNextAttribute()) {
               ...
            }
            $xmlReader->moveToElement();
        }
        if ($xmlReader->isEmptyElement) {
            $xmlWriter->endElement();
        }

关于php - 使用 PHP XMLReader 检测 XML 自闭标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45457014/

相关文章:

php - Symfony2 自定义表单类型 key 对

javascript - 如何获取post/get中多选下拉值的所有选定值?

php - URI 中的 Laravel 条件

java - 使用 JAXB 将多个 XML 元素的内容提取为文本

php - 尝试让登录识别管理员

找到 Android Studio 3.0.1 未知元素 <user-permission>

python - 使用 py2neo 将数据从 XML 加载到 neo4j

c++ - 有没有办法使用 libxml2 自动检测根标签中写入的命名空间?

ruby-on-rails - 使用 Babun 安装 nokogiri 1.6.6.2 出现错误 'libxml2 version 2.6.21 or later is required!'

Python libxml2 XPath/命名空间帮助