从节点列表中检索单个节点值

时间:2010-09-29 10:03:19

标签: php xml

我很难从节点列表中提取单个节点值。

我的代码采用一个xml文件,其中包含多个字段,其中一些包含文本,文件路径和带扩展名的完整图像名称。

我对它运行一个expath查询,查找具有特定id的节点项。然后它存储匹配的节点项并将其保存为$ 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');

任何帮助都会很棒。

由于

1 个答案:

答案 0 :(得分: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);
}

您还可以在$ oldnode上使用getElementsByTagName,然后查看是否找到了任何内容(如果找到了节点,$ oldnode-> getElementsByTagName(“thumbnailImg”) - > item(0) - >的nodeValue)。哪个可能更清洁然后循环它们。

相关问题