分析带连字符的XML标记时未按预期工作


Parsing XML tags with hyphens not working as expected

部分归功于SO,我能够想出如何使用连字符访问XML标记(<some-tag>)。我看到的所有例子都是这样做的。

$content = $xml->{'document-content'};

但对我来说,这行不通,也是如此

$content = $xml->{document-content};

没有引号(我不记得是怎么想出来的,可能是个错误)。如果我使用报价,我会得到这个错误

注意:在第26行的/html/my/dir/myfile.php中尝试获取非对象的属性

所以有人会认为不用引号就可以使用它。当然,直到我找到解析XML的原因。XML来自ODT文件,最终将用作生成PDF的模板。在开发任何东西时,我总是使用";E_ ALL";错误报告。有了它的设置,当我在没有引号的情况下使用它时,我会得到这两个错误。

注意:在第24行的/html/my/dir/myfile.php中使用未定义的常量文档-假定为"document"

注意:使用未定义的常量内容-假设在第24行的/html/my/dir/myfile.php中为"content"

但是,它确实可以很好地解析文档的其余部分。问题是我需要创建一个PDF,如果它输出";"通知";在PDF生成器运行";标题";没有正确设置,也没有创建PDF。现在有人可能建议我关闭错误报告,但如果PDF不起作用,我就看不到这些错误。

事实上,我不知道为什么它在没有引用的情况下仍然有效。我所知道的关于PHP语法的一切都表明,如果没有引号,它将是一个常量(正如错误所指出的),必须在它之前的某个位置定义。因此,整个解析器在这一点上应该会失败,但事实并非如此,事实恰恰相反,解析器可以工作。

大多数情况下,我只需要知道如何在不禁用错误报告的情况下消除这两个通知错误。我很感兴趣的是,为什么它在没有引号的情况下工作,因为它的工作方式似乎完全偏离了编程的所有规范。

以防万一,这里需要的是导致"$内容";

$zip = new ZipArchive;
if ($zip->open('../docs/myfile.odt') === true)
{
    $xmlstring = $zip->getFromName('content.xml');
    $zip->close();
}
// remove all namespaces and swaps out tab and space tags
$replace = array('office:', 'style:', 'draw:', 'fo:', 'text:', 'svg:', '<tab/>', '<s/>');
$value = array('', '', '', '', '', '', "'t", '&#160;');
$xmlstring = str_replace($replace, $value, $xmlstring);
$xmlstring = preg_replace_callback('/<s c="(.+?)"'/>/s', 'ReplaceSpaces', $xmlstring);
$xml = simplexml_load_string($xmlstring);
$content = $xml->{document-content};

我应该振作起来,多年来我解析了很多XML文件和RSS提要,答案很简单。使用SimpleXML时,您不需要引用XML的主元素。

<document-content>
    <tag1>
    </tag1>
    <tag2>
        <anothertag>
        </anothertag>
    </tag2>
</document-content>

因此$xml->{document-content}->tag2(或$xml->{0}->tag2)与$xml->tag2 完全相同

我猜这是我第一次使用odt文件,而且必须处理它的一些麻烦,我忽略了显而易见的问题。