0

我一直在尝试制作一个 PHP 脚本来编辑用于更改网站导航栏的 XML 文件。然而,每当我运行这段代码的大部分时间,它都会报告一堆错误:

注意:尝试在第 96 行的 /Volumes/web/edit/includes/new-page.php 中获取非对象的属性

警告:在第 96 行的 /Volumes/web/edit/includes/new-page.php 中为 foreach() 提供的参数无效

注意:在/Volumes/web/edit/includes/new-page.php第110行间接修改SimpleXMLElement的重载元素无效

致命错误:在第 113 行的 /Volumes/web/edit/includes/new-page.php 中的非对象上调用成员函数 addChild()

以下是我遇到问题的脚本部分。对不起,如果它有点混乱或奇怪,因为我是 XML 新手。它所要做的就是获取某个元素的所有子元素,再添加一个子元素,按字母顺序对它们进行排序,然后将它们放回 XML 文件中。

$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());

这是上述脚本获取的示例输入。

$xmlfile    = "/Volumes/web/nav.xml";
$navpartnum = 0;
$parent     = "about";
$title      = "Contact";
$navpointer = "/about/contact/";

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

<?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>

这个脚本工作了几次,但现在它只显示了我之前所说的错误。我也在使用 PHP 5.4.10。关于可能是什么问题的任何想法?

4

2 回答 2

0

让我们来看看:

foreach ($nxml->$parent->part[$navpartnum]->item as $item1) { //Line 96

你报告了这个错误:

注意:尝试在第 96 行的 /Volumes/web/edit/includes/new-page.php 中获取非对象的属性

警告:在第 96 行的 /Volumes/web/edit/includes/new-page.php 中为 foreach() 提供的参数无效

这只是意味着您希望数据位于它不存在的地方。SimpleXML 不会立即抛出任何异常告诉您,因此当它不稳定时,您需要自己小心:

$items = $nxml->$parent->part[$navpartnum]->item;
if (!($items instanceof SimpleXMLElement)) {
    throw new Exception('Unable to obtain items.');
}

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

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

$nxml->asXML('php://stdout');

或者

$nxml->asXML('php://stderr');

将其放入错误流中。

于 2013-03-20T16:53:46.583 回答
0

所以事实证明脚本很好,输入实际上是错误的。在第一百次查看脚本并转储每个变量后,我意识到这$navpartnum实际上是一个字符串而不是一个数字。所以显然 simpleXML 是在寻找一个名为的元素"0",而不是寻找索引为0. 哎呀!

于 2013-03-20T18:10:08.713 回答