0

Web サイトのナビゲーション バーを変更するために使用される XML ファイルを編集する PHP スクリプトを作成しようとしています。ただし、ほとんどの場合、このコードを実行すると、一連のエラーが報告されます。

注意: 96 行目で /Volumes/web/edit/includes/new-page.php の非オブジェクトのプロパティを取得しようとしています

警告: 96 行目の /Volumes/web/edit/includes/new-page.php の foreach() に無効な引数が指定されています

注意: SimpleXMLElement のオーバーロードされた要素を間接的に変更しても、/Volumes/web/edit/includes/new-page.php の 110 行目では効果がありません

致命的なエラー: 113 行目の /Volumes/web/edit/includes/new-page.php の非オブジェクトに対するメンバー関数 addChild() の呼び出し

以下は、私が問題を抱えているスクリプトの一部です。私は XML に慣れていないので、少し面倒だったり奇妙だったりしたら申し訳ありません。特定の要素のすべての子を取得し、子をもう 1 つ追加し、アルファベット順に並べ替えて、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

したがって、スクリプトは問題なく、入力は実際には間違っていることがわかります。$navpartnumスクリプトを調べて、すべての変数を 100 回ダンプした後、実際には数値ではなく文字列であることに気付きました。どうやら simpleXML は"0"、インデックスが の要素を探すのではなく、という名前の要素を探していたようです0。おっと!

于 2013-03-20T18:10:08.713 に答える
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 に答える