解析带有连字符的 XML 标签未按预期工作
Parsing XML tags with hyphens not working as expected
部分要感谢 SO,我才能够弄清楚如何使用连字符 () 访问 XML 标签。我见过的所有例子都是这样做的。
$content = $xml->{'document-content'};
但对我来说行不通,而这个行得通
$content = $xml->{document-content};
没有引号(我不记得是怎么想出来的,可能是个错误)。如果我使用引号,我会得到这个错误
Notice: Trying to get property of non-object in /html/my/dir/myfile.php on line 26
所以人们会认为不带引号就使用它。当然,这就是我要解析 XML 的原因。 XML 来自 ODT 文件,最终将用作生成 PDF 的模板。在开发任何东西时,我总是使用“E_ALL”错误报告。设置好后,当我在不带引号的情况下使用它时,会出现这两个错误。
Notice: Use of undefined constant document - assumed 'document' in /html/my/dir/myfile.php on line 24
Notice: Use of undefined constant content - assumed 'content' in /html/my/dir/myfile.php on line 24
但是,它确实可以很好地解析文档的其余部分。问题是我需要创建一个 PDF,如果它在 PDF 生成器 运行 之前输出“通知”错误,则“header”没有正确设置并且没有创建 PDF。现在有人可能会建议我关闭错误报告,但如果 PDF 不工作我就看不到这些错误。
事实上,我不知道为什么它在没有引号的情况下仍然有效。我所知道的关于 PHP 语法的一切都表明,如果没有引号,它将是一个常量(正如错误指出的那样),必须在它之前的某个地方定义。因此整个解析器应该在那个时候失败,但它并没有,事实上解析器工作的情况恰恰相反。
大多数情况下,我只需要知道如何在不禁用错误报告的情况下消除这 2 个通知错误。而且我很想知道为什么它在没有引号的情况下工作,因为它的工作方式似乎完全偏离了所有编程规范。
为了以防万一这里需要它是导致“$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};
我应该踢自己,这些年来我分析了很多 XML 文件和 RSS 提要,答案很简单。使用 SimpleXML.
时,不需要 引用 XML 的主要元素
<document-content>
<tag1>
</tag1>
<tag2>
<anothertag>
</anothertag>
</tag2>
</document-content>
因此 $xml->{document-content}->tag2
(或 $xml->{0}->tag2
)与 $xml->tag2
完全相同
我猜这是我第一次使用 odt 文件,并且不得不处理它的一些麻烦,我忽略了显而易见的。
部分要感谢 SO,我才能够弄清楚如何使用连字符 (
$content = $xml->{'document-content'};
但对我来说行不通,而这个行得通
$content = $xml->{document-content};
没有引号(我不记得是怎么想出来的,可能是个错误)。如果我使用引号,我会得到这个错误
Notice: Trying to get property of non-object in /html/my/dir/myfile.php on line 26
所以人们会认为不带引号就使用它。当然,这就是我要解析 XML 的原因。 XML 来自 ODT 文件,最终将用作生成 PDF 的模板。在开发任何东西时,我总是使用“E_ALL”错误报告。设置好后,当我在不带引号的情况下使用它时,会出现这两个错误。
Notice: Use of undefined constant document - assumed 'document' in /html/my/dir/myfile.php on line 24
Notice: Use of undefined constant content - assumed 'content' in /html/my/dir/myfile.php on line 24
但是,它确实可以很好地解析文档的其余部分。问题是我需要创建一个 PDF,如果它在 PDF 生成器 运行 之前输出“通知”错误,则“header”没有正确设置并且没有创建 PDF。现在有人可能会建议我关闭错误报告,但如果 PDF 不工作我就看不到这些错误。
事实上,我不知道为什么它在没有引号的情况下仍然有效。我所知道的关于 PHP 语法的一切都表明,如果没有引号,它将是一个常量(正如错误指出的那样),必须在它之前的某个地方定义。因此整个解析器应该在那个时候失败,但它并没有,事实上解析器工作的情况恰恰相反。
大多数情况下,我只需要知道如何在不禁用错误报告的情况下消除这 2 个通知错误。而且我很想知道为什么它在没有引号的情况下工作,因为它的工作方式似乎完全偏离了所有编程规范。
为了以防万一这里需要它是导致“$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};
我应该踢自己,这些年来我分析了很多 XML 文件和 RSS 提要,答案很简单。使用 SimpleXML.
时,不需要 引用 XML 的主要元素<document-content>
<tag1>
</tag1>
<tag2>
<anothertag>
</anothertag>
</tag2>
</document-content>
因此 $xml->{document-content}->tag2
(或 $xml->{0}->tag2
)与 $xml->tag2
我猜这是我第一次使用 odt 文件,并且不得不处理它的一些麻烦,我忽略了显而易见的。