2013-03-20 2 views
0

웹 사이트의 탐색 바를 변경하는 데 사용되는 XML 파일을 편집하는 PHP 스크립트를 만들려고했습니다. 대부분의 시간이 코드를 실행할 때마다 그러나, 오류의 무리를보고SimpleXML addChild 오류

Notice: Trying to get property of non-object in /Volumes/web/edit/includes/new-page.php on line 96

Warning: Invalid argument supplied for foreach() in /Volumes/web/edit/includes/new-page.php on line 96

Notice: Indirect modification of overloaded element of SimpleXMLElement has no effect in /Volumes/web/edit/includes/new-page.php on line 110

Fatal error: Call to a member function addChild() on a non-object in /Volumes/web/edit/includes/new-page.php on line 113

아래는 내가에 문제가 스크립트의 일부입니다. 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

'$ nxml -> $ parent-> part [$ navpartnum]'을 덤프하려고 했습니까? – Uby

+0

@Uby 줄 $ 110이 나에게'NULL'을 줄 직전에'$ nxml -> $ parent-> part [$ navpartnum]'의 var_dump를 입력하십시오. – HZN

+1

글쎄, 당신이 기대 한 것을 얻지 못하면 코드를 디버그해야합니다. – Uby

답변

0

그래서 스크립트가 제대로 작동하고 입력이 실제로 잘못되었습니다. 스크립트를보고 100 번째 시간 동안 모든 변수를 버린 후, 나는 $navpartnum이 실제로 숫자가 아닌 문자열임을 깨달았습니다. 따라서 명백히 simpleXML은 0의 색인을 가진 요소를 찾는 대신 "0"이라는 요소를 찾고있었습니다. 와!

+0

예 simplexml은 숫자 (n 번째 요소)와 문자열 (첫 번째 요소의 여러 요소 인 경우 요소의 특성)간에 다릅니다. – hakre

0

보자 :

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

는이 오류를보고 :

Notice: Trying to get property of non-object in /Volumes/web/edit/includes/new-page.php on line 96

Warning: Invalid argument supplied for foreach() in /Volumes/web/edit/includes/new-page.php on line 96

을 당신이 그렇지 않은 경우 데이터가 어딘가에있을 것으로 예상 것을 의미한다. SimpleXML을이이 안정되지 그렇게 할 때 자신에주의를 유지하기 위해 필요한 멀리있는 권리를 말하는 예외를 throw하지 않습니다 :

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

오류 스트림에 그것을 넣어 .