2013-05-02 5 views
7

Otrzymuję błąd podczas zastępowania lub dodawania dziecka do węzła.Niepożądany wyjątek "DOMException" z komunikatem "Błąd żądania hierarchii"

Wymagane jest:

Chcę zmienić to ..

<?xml version="1.0"?> 
<contacts> 
    <person>Adam</person> 
    <person>Eva</person> 
    <person>John</person> 
    <person>Thomas</person> 
</contacts> 

jak ten

<?xml version="1.0"?> 
<contacts> 
    <person>Adam</person> 
    <p> 
     <person>Eva</person> 
    </p> 
    <person>John</person> 
    <person>Thomas</person> 
</contacts> 

błędu jest

Fatal error: Uncaught exception 'DOMException' with message 'Hierarchy Request Error'

mój kod jest

function changeTagName($changeble) { 
    for ($index = 0; $index < count($changeble); $index++) { 
     $new = $xmlDoc->createElement("p"); 
     $new ->setAttribute("channel", "wp.com"); 
     $new ->appendChild($changeble[$index]); 
     $old = $changeble[$index]; 
     $result = $old->parentNode->replaceChild($new , $old); 
    } 
} 
+0

możesz zobaczyć wymagania xml w pytaniach szczegółowych ... –

+0

kiedy próbuję użyć replaceChild, otrzymuję błąd z informacją "Hierarchy Request Error" Nie mam pojęcia, co robię. –

+0

Po prostu chcę, żeby węzeł był potrzebny być zawarte w tagu p to to. –

Odpowiedz

36

Błąd Hierarchia Zapytanie Błąd z DOMDocument w PHP oznacza, że ​​starają się przenieść węzeł w siebie. Porównaj to z wężem na poniższym rysunku:

Snake eats itself

Podobnie jest z węzła. Przenosisz węzeł w siebie. Oznacza to, że w chwili, gdy chcesz zastąpić osobę akapitem, ta osoba jest już dzieckiem akapitu.

Sposób appendChild() już skutecznie przenosi osobę z drzewa DOM, nie jest częścią dłużej:

$para = $doc->createElement("p"); 
$para->setAttribute('attr', 'value'); 
$para->appendChild($person); 

<?xml version="1.0"?> 
<contacts> 
    <person>Adam</person> 

    <person>John</person> 
    <person>Thomas</person> 
</contacts> 

Eva już nie ma. Jego parentNode jest już akapitem.

więc zamiast najpierw chcesz zastąpić, a następnie dołączyć dziecko:

$para = $doc->createElement("p"); 
$para->setAttribute('attr', 'value'); 
$person = $person->parentNode->replaceChild($para, $person); 
$para->appendChild($person); 

<?xml version="1.0"?> 
<contacts> 
    <person>Adam</person> 
    <p attr="value"><person>Eva</person></p> 
    <person>John</person> 
    <person>Thomas</person> 
</contacts> 

Teraz wszystko jest w porządku.

+0

to działa dokładnie to, co chcę .. I bardzo, bardzo dziękuję za dobre wyjaśnienie .. Dziękuję –

+2

Dobra odpowiedź. Dzięki. –

Powiązane problemy