使用连字符解析XML标记不能按预期工作

时间:2016-03-28 06:17:36

标签: php xml xml-parsing odt odf

部分谢谢你,我能够弄清楚如何使用连字符(< 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中假定为'document'

     

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

但是,它确实解析了文档的其余部分。问题是我需要创建一个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", '&#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};

1 个答案:

答案 0 :(得分:0)

我应该自己动手,多年来我已经解析了很多XML文件和RSS源,答案非常简单。在使用SimpleXML时,需要引用XML的主要元素。

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

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

我猜这是我第一次使用odt文件,并且不得不处理一些麻烦,我忽略了显而易见的事情。