2010-09-29 2 views
1

У меня возникли трудности с извлечением одного значения узла из нодлиста.Извлечение значения одного узла из ноделиста

Мой код принимает файл xml, который содержит несколько полей, некоторые из которых содержат текст, пути к файлам и полные имена изображений с расширениями.

Я запускаю запрос expath по нему, ища элемент узла с определенным идентификатором. Затем он сохраняет совпадающий элемент узла и сохраняет его как $ oldnode

Теперь моя проблема заключается в попытке извлечь значение из этого $ oldnode. Я попытался var_dump ($ oldnode) и print_r ($ oldnode), но он возвращает следующее: "object (DOMElement) # 8 (0) {}"

Я предполагаю, что переменная $ oldnode является объектом, но как получить доступ к нему?

Я могу отследить весь список узлов, используя: echo $ oldnode-> nodeValue;

Отображаются все узлы в списке.

Вот код, который обрабатывает XML-файл. линия 6 - линия, о которой идет речь ...

$xpathexp = "//item[@id=". $updateID ."]"; 
      $xpath = new DOMXpath($xml); 
      $nodelist = $xpath->query($xpathexp); 
      if((is_null($nodelist)) || (! is_numeric($nodelist))) { 
       $oldnode = $nodelist->item(0); 
       echo $oldnode->nodeValue; 
       //$imgUpload = strchr($oldnode->nodeValue, ' '); 
       //$imgUpload = strrchr($imgUpload, '/'); 
       //explode('/',$imgUpload); 

       //$imgUpload = trim($imgUpload); 


       $newItem = new DomDocument; 
       $item_node = $newItem ->createElement('item'); 

       //Create attribute on the node as well 
       $item_node ->setAttribute("id", $updateID); 

       $largeImageText = $newItem->createElement('largeImgText'); 
       $largeImageText->appendChild($newItem->createCDATASection($largeImgText)); 
       $item_node->appendChild($largeImageText); 

       $urlANode = $newItem->createElement('urlA'); 
       $urlANode->appendChild($newItem->createCDATASection($urlA)); 
       $item_node->appendChild($urlANode); 

       $largeImg = $newItem->createElement('largeImg'); 
       $largeImg->appendChild($newItem->createCDATASection($imgUpload)); 
       $item_node->appendChild($largeImg); 

       $thumbnailTextNode = $newItem->createElement('thumbnailText'); 
       $thumbnailTextNode->appendChild($newItem->createCDATASection($thumbnailText)); 
       $item_node->appendChild($thumbnailTextNode); 

       $urlB = $newItem->createElement('urlB'); 
       $urlB->appendChild($newItem->createCDATASection($urlA)); 
       $item_node->appendChild($urlB); 

       $thumbnailImg = $newItem->createElement('thumbnailImg'); 
       $thumbnailImg->appendChild($newItem->createCDATASection(basename($_FILES['thumbnailImg']['name']))); 
       $item_node->appendChild($thumbnailImg); 

       $newItem->appendChild($item_node); 

       $newnode = $xml->importNode($newItem->documentElement, true); 

         // Replace 
       $oldnode->parentNode->replaceChild($newnode, $oldnode); 

       // Display 
       $xml->save($xmlFileData); 
           //header('Location: index.php?a=112&id=5'); 

Любая помощь будет замечательной.

Благодаря

ответ

2

Разве не должно быть echo $oldnode->firstChild->nodeValue;? Я помню это, потому что технически вам нужно значение из текстового узла. Но я могу ошибаться, это было давно. Вы могли бы попробовать?

После нашей дискуссии в комментариях к этому ответу я придумал это решение. Я не уверен, возможно ли это сделать чище. Но это должно сработать.

$nodelist = $xpath->query($xpathexp); 
if((is_null($nodelist)) || (! is_numeric($nodelist))) { 
    $oldnode = $nodelist->item(0); 

    $largeImg  = null; 
    $thumbnailImg = null; 
    foreach($oldnode->childNodes as $node) { 
     if($node->nodeName == "largeImg") { 
      $largeImg  = $node->nodeValue; 
     } else if($node->nodeName == "thumbnailImg") { 
      $thumbnailImg = $node->nodeValue; 
     } 
    } 

    var_dump($largeImg); 
    var_dump($thumbnailImg); 
} 

Вы можете также использовать getElementsByTagName на $ oldnode, тогда смотрите, если он нашел что-нибудь (и если узел был найден, $ oldnode-> getElementsByTagName ("thumbnailImg") -> пункт (0) -> nodeValue). Который может быть более чистым, а затем прокручивать их.

+0

да, который захватывает первое дочернее значение .. это здорово .. Но как я могу пройти через объект и выбрать элемент, который я хочу? Также, как получить результат всего объекта? – Owzzz

+0

Я не уверен, что вы имеете в виду, вы уже выбираете элемент, который хотите, используя свой Xpath, не так ли? И какой вывод вы ожидаете от «всего объекта», можете ли вы привести пример? (возможно, на pastebin.com?) – CharlesLeaf

+0

xpath выбирает элемент с идентификатором определенного значения. Этот элемент (узел) имеет несколько узлов внутри него. Пример списка узлов в файле xml выглядит следующим образом: http://pastebin.com/R8qmbg9F ... поэтому, используя вашу строку: $ oldnode-> firstChild-> nodeValue; он захватывает значение узла Owzzz

Смежные вопросы