2013-04-19 3 views
0

Как переименовать значение в xml с помощью PHP? Это то, что я получил до сих пор:Как переименовать значения XML с помощью php?

<?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"); 

В принципе, то, что он делает это взять два названия из URL, старого существующего названия, а один пользователь хочет изменить его (так как это oldtitle|^newtitle), и помещает их в массив.

То, что я пробовал делать, - это удаление существующего старого заголовка, а затем создание нового заголовка с использованием нового значения заголовка из URL-адреса, но он, похоже, не работает. Где я ошибаюсь, или есть более простой способ сделать это?

+0

кажется, что вы устанавливаете '$ dom-> preserveWhiteSpace' четыре раза, когда только первый должно быть необходимыми ... –

+0

@FrankFarmer сожалеют об этом, зафиксировал его. Есть ли какой-то способ, хотя я могу добиться этого? – looserlf

+0

@looserlf: Проверьте свой код еще раз, я внесла некоторые исправления. Большинство этих настроек вы можете устанавливать только * один раз * и принадлежать перед выполнением 'load()' (это не совсем точно, но оно должно дать вам хорошее руководство в начале, пока вы не прочитаете об этих свойствах в руководстве и не поняли что они делают). – hakre

ответ

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"); 
+0

Отлично, спасибо! – looserlf

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