部分感谢 SO,我能够弄清楚如何使用连字符 (<some-tag>) 访问 XML 标记。我见过的所有例子都是这样的。
$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 中假定为“文档”
注意:使用未定义的常量内容 - 在第 24 行的 /html/my/dir/myfile.php 中假定为“内容”
但是,它确实可以很好地解析文档的其余部分。问题是我需要创建一个 PDF,如果它在运行“标题”的 PDF 生成器之前输出“通知”错误,则没有正确设置并且没有创建 PDF。现在有人可能会建议我关闭错误报告,但如果 PDF 无法正常工作,我将看不到这些错误。
事实上,我不知道为什么它在没有引号的情况下完全有效。我所知道的关于 PHP 语法的一切都表明,如果没有引号,它将是一个常量(如错误指出的那样),必须在它之前的某个地方定义。因此,整个解析器此时应该会失败,但事实并非如此,事实上,解析器的工作情况恰恰相反。
大多数情况下,我只需要知道如何在不禁用错误报告的情况下消除这两个通知错误。而且我会对它为什么没有引号也能工作很感兴趣,因为它的工作方式似乎大大偏离了所有的编程规范。
以防万一这里需要的是导致“$ content”的所有代码
$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", ' ');
$xmlstring = str_replace($replace, $value, $xmlstring);
$xmlstring = preg_replace_callback('/<s c="(.+?)"\/>/s', 'ReplaceSpaces', $xmlstring);
$xml = simplexml_load_string($xmlstring);
$content = $xml->{document-content};