我一直在尝试编写一个PHP脚本来编辑用于更改网站导航栏的XML文件。但是,每当我运行此代码的大部分时间,它都会报告一堆错误:
注意:尝试在第96行的/Volumes/web/edit/includes/new-page.php中获取非对象的属性
警告:在第96行的/Volumes/web/edit/includes/new-page.php中为foreach()提供的参数无效
注意:间接修改SimpleXMLElement的重载元素对第110行的/Volumes/web/edit/includes/new-page.php没有影响
致命错误:在第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。关于可能出现什么问题的任何想法?
答案 0 :(得分: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');
将其放入错误流中。
答案 1 :(得分:0)
事实证明,脚本很好,输入实际上是错误的。在查看脚本并将每个变量转储第一百次之后,我意识到$navpartnum
实际上是一个字符串而不是一个数字。显然,simpleXML正在寻找一个名为"0"
的元素,而不是寻找索引为0
的元素。糟糕!