如何使用php重命名XML值?

时间:2013-04-19 22:52:30

标签: php xml dom xpath

如何使用PHP重命名xml中的值?这是我到目前为止所得到的:

<?php
$q = $_GET["q"];
$q = stripslashes($q);

$q = explode('|^', $q);

$old = $q[0];

$dom                     = new DOMDocument;
$dom->preserveWhiteSpace = false;
$dom->formatOutput       = true;

$dom->Load("test.xml");

$xpath   = new DOMXPath($dom);    
$query1  = 'channel/item[title="' . $old . '"]/title';
$entries = $xpath->query($query1);

foreach ($entries as $entry) 
{        
    $oldchapter = $entry->parentNode->removeChild($entry);

    $item       = $dom->getElementsByTagName('item');

    foreach ($item as $items) 
    {
        $title = $dom->createElement('title', $q[1]);            
        $items->appendChild($title);            
    }
}    

$dom->save("test.xml");

基本上,它的作用是从网址中获取两个标题,旧的现有标题,以及用户想要将其更改为的标题(如此oldtitle|^newtitle),并将它们放入数组中。 / p>

我尝试过做的是删除现有的旧标题,然后使用网址中的新标题值创建一个新标题,但它似乎不起作用。我哪里出错了,或者有更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

执行此操作的方法是使用DOMNode::replaceChild()。你的大部分代码都是正确的,你只是稍微过度复杂了一些DOM的东西。

试试这个:

<?php

    $q = $_GET["q"];
    $q = stripslashes($q);

    $q = explode('|^', $q);

    $old = $q[0];

    $dom                     = new DOMDocument;

    // Do this *before* loading the document
    $dom->preserveWhiteSpace = false;
    $dom->formatOutput       = true;

    $dom->Load("test.xml");
    $xpath = new DOMXPath($dom);

    $query1  = 'channel/item[title="' . $old . '"]/title';
    $entries = $xpath->query($query1);

    // This is all you need to do in the loop
    foreach ($entries as $oldTitle) {
        $newTitle = $dom->createElement('title', $q[1]);
        $entry->parentNode->replaceChild($newTitle, $oldTitle);
    }

    $dom->save("test.xml");