Php 解析带有连字符的XML标记未按预期工作

Php 解析带有连字符的XML标记未按预期工作,php,xml,xml-parsing,odt,odf,Php,Xml,Xml Parsing,Odt,Odf,一定程度上要感谢SO,所以我能够找出如何使用连字符()访问XML标记。我看到的所有例子都是这样做的 $content = $xml->{'document-content'}; 但对我来说,这不管用,这确实管用 $content = $xml->{document-content}; 这是没有引用的(我是如何发现的,我不记得了,可能是个错误)。如果我使用引号,我会得到这个错误 注意:试图在第26行的/html/my/dir/myfile.php中获取非对象的属性 所以有人会认为不

一定程度上要感谢SO,所以我能够找出如何使用连字符()访问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-假定为“document”

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

但是,它可以很好地解析文档的其余部分。问题是,我需要创建一个PDF,如果它在运行“标题”的PDF生成器之前输出“注意”错误,则无法正确设置,也不会创建PDF。现在有人可能建议我关闭错误报告,但是如果PDF不工作,我就看不到这些错误

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

大多数情况下,我只需要知道如何在不禁用错误报告的情况下消除这两个通知错误。我非常感兴趣的是,为什么它没有引用就可以工作,因为它的工作方式似乎与所有编程规范都有很大的不同

为了以防万一,这里需要所有指向“$content”的代码

$zip=新的ZipArchive;
如果($zip->open('../docs/myfile.odt')==true)
{
$xmlstring=$zip->getFromName('content.xml');
$zip->close();
}
//删除所有名称空间并替换出选项卡和空间标记
$replace=array('office:'、'style:'、'draw:'、'fo:'、'text:'、'svg:'、'');
$value=数组(“”、“”、“”、“”、“”、“”、“\t”、“ ;”);
$xmlstring=str_replace($replace,$value,$xmlstring);
$xmlstring=preg_replace_回调('//s','ReplaceSpaces',$xmlstring);
$xml=simplexml\u load\u字符串($xmlstring);
$content=$xml->{documentcontent};

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

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

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


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

您将XML解析与通用PHP语法、字符串操作和其他一些问题混合在一起。您不需要“只需要清除错误消息”<代码>文档内容将从字符串
文档
中减去字符串
内容
——结果为
0
。零不是一个有效的标记名,不能存在于XML中。因此,基本上它得到的是XML对象“0”???所以我给了
$xml->{0}
,在我的代码中进行了一次尝试,它也可以工作,并且没有错误消息。所以你间接地解决了这个问题。但我仍然对解释XML解析为何有效感兴趣。你的最后一句话似乎暗示我的代码不应该工作。我同意它不应该这样,那么为什么它会起作用呢?它不起作用。第一条错误消息表示$content不是对象。分离并封装源代码的不同部分,并对其进行调试。
<document-content>
    <tag1>
    </tag1>
    <tag2>
        <anothertag>
        </anothertag>
    </tag2>
</document-content>