首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SimpleXML addChild误差

SimpleXML addChild误差
EN

Stack Overflow用户
提问于 2013-03-20 16:02:50
回答 2查看 1.4K关注 0票数 0

我一直试图制作一个PHP脚本来编辑一个XML文件,该文件用于更改网站的导航栏。但是,每当我运行这段代码时,它都会报告大量错误:

注意:在第96行中,尝试获取非对象的属性:/Volumes/web/编辑/include/new-page.php。 警告:在第96行中为foreach()提供的参数无效,该参数位于/卷/web/编辑/include/new-page.php中。 注意:对SimpleXMLElement中重载元素的间接修改对第110行中的/卷/web/编辑/包括/new-page.php没有影响。 致命错误:在第113行中调用非对象上的成员函数addChild()

下面是脚本中我遇到麻烦的部分。如果它有点混乱或奇怪,很抱歉,因为我对XML还不熟悉。它所要做的就是获取某个元素的所有子元素,再添加一个子元素,按字母顺序排序,然后将它们放入XML文件中。

代码语言:javascript
复制
$nxml = simplexml_load_file($xmlfile) or die ("Unable to load XML file!");

$items = array();
foreach ($nxml->$parent->part[$navpartnum]->item as $item1) { //Line 96
    $items[] .= "{$item1->title} - {$item1->link}";
}

$items[] .= "{$title} - {$navpointer}";

sort($items);

$navparts = array();
foreach ( $items as $item2 ) {
    $itemparts = explode(" - ",$item2);
    $navparts[$itemparts[0]] = $itemparts[1];
}

unset($nxml->$parent->part[$navpartnum]->item); //Line 110

foreach( $navparts as $akey => $avalue ) {
    $makeitem = $nxml->$parent->part[$navpartnum]->addChild('item'); //Line 113
    $makeitem->addChild('title',$akey);
    $makeitem->addChild('link',$avalue);
}

file_put_contents($xmlfile, $nxml->asXML());

下面是上面的脚本获得的一个示例输入。

代码语言:javascript
复制
$xmlfile    = "/Volumes/web/nav.xml";
$navpartnum = 0;
$parent     = "about";
$title      = "Contact";
$navpointer = "/about/contact/";

最后,这里是XML文件的示例。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<navbar>
<about parts="2">
    <part num="1">
        <item>
            <title>Overview</title>
            <link>/about/overview/</link>
        </item>
    </part>
    <part num="2">
        <item>
            <title>Activities and Athletics</title>
            <link>/about/activities_and_athletics/</link>
        </item>
    </part>
</about>
</navbar>

这个脚本工作了几次,但现在它只显示了我之前说过的错误。另外,我使用的是PHP5.4.10。对于这个问题有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-20 18:10:08

因此,它的脚本是好的,而输入实际上是错误的。在查看了脚本并第100次转储了每个变量之后,我意识到$navpartnum实际上是一个字符串而不是一个数字。显然,simpleXML是在寻找一个名为"0"的元素,而不是寻找索引为0的元素。哇哦!

票数 0
EN

Stack Overflow用户

发布于 2013-03-20 16:53:46

让我们看看:

代码语言:javascript
复制
foreach ($nxml->$parent->part[$navpartnum]->item as $item1) { //Line 96

您报告了此错误:

注意:在第96行中,尝试获取非对象的属性:/Volumes/web/编辑/include/new-page.php。 警告:在第96行中为foreach()提供的参数无效,该参数位于/卷/web/编辑/include/new-page.php中。

这只是意味着你期望数据在某个不存在的地方。SimpleXML不会立即抛出任何异常,所以当情况不稳定时,您需要自己小心:

代码语言:javascript
复制
$items = $nxml->$parent->part[$navpartnum]->item;
if (!($items instanceof SimpleXMLElement)) {
    throw new Exception('Unable to obtain items.');
}

foreach ($items as $item1) {
   ...
}

这只是早期显式错误检查。您可能还想回顾一下为什么事情不能工作,例如查看一下XML。我建议您为此创建一个格式化函数,因为SimpleXML的XML输出在默认情况下无法格式化,因此很难读懂:

代码语言:javascript
复制
$nxml->asXML('php://stdout');

代码语言:javascript
复制
$nxml->asXML('php://stderr');

将其输出到错误流。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15528699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档