试图获取非对象SimpleXML的属性

时间:2012-08-18 18:28:28

标签: php simplexml

我尝试了多种代码组合,即使我认为自己掌握了它,也失败了!我总是回到“获取非对象错误的属性”我现在的一个是:

Notice: Trying to get property of non-object in {PROJECT_DIR} on line 11

无论如何,我正在尝试更改.docx文件document.xml文件中书签的节点值,我有一个书签ID =>的数组。书签名称和我使用简单的foreach循环使用SimpleXML来编辑所有找到的书签,但是,我遇到了一些问题。

我目前的代码是:

if (file_exists('document.xml'))
{
    $document = simplexml_load_file('document.xml');
}
echo $document->getName() . "<br />";
echo $document->document->body->{'w:bookmarkStart'};

我已尝试从echo语句中删除 - &gt;文档并将{'w:bookmarkStart'}更改为bookmarkStart但所有已证明无效,但上述更改我说我尝试过没有返回通知,只是空白。 我确定我还没有得到这个XML的主旨,而且我很喜欢它,它可能很容易为你们指出问题,但代码示例的研究和使用已经证明对我无效;( 我试图编辑的XML文件的紧凑版本是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:o="urn:schemas-microsoft-com:office:office"
            xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
            xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml"
            xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
            xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
            xmlns:w10="urn:schemas-microsoft-com:office:word"
            xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
            xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
            xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
            xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
            xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
            xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 wp14">
    <w:body>
            <w:bookmarkStart w:id="0" w:name="MOREG"/>
            <w:bookmarkEnd w:id="0"/>
    </w:body>
</w:document>

2 个答案:

答案 0 :(得分:0)

也许这会有所帮助? $document->xpath("//w:bookmarkEnd"); 使用xpath查询可能更实用,它可以很好地选择节点。 (也许有人在这里可以帮助你找到一种方法来做到这一点,抱歉,如果这没有帮助)

答案 1 :(得分:0)

不幸的是,名称空间(示例中的<w:...表示法和xmlns:w="..."声明)使得SimpleXML变得不那么简单了。

首先要知道的是w:前缀实际上只是“真实”命名空间的本地别名,它是由相应的xmlns:w属性定义的URI - 在本例中为{ {1}}

要知道的第二件事是,要获取除默认(未加前缀)命名空间之外的任何元素,您需要使用SimpleXML方法->children($namespace)->attributes($namespace)

因此,通过一些试错,我得到了您的示例XML,使用以下内容输出“MOREG”:

'http://schemas.openxmlformats.org/wordprocessingml/2006/main'

如果你使用PHP≥5.2,你可以通过将$w = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'; echo $document->children($w)->body->bookmarkStart['name']; 传递给true方法来实际使用'w'前缀,简化了这一点:

children