Ben DOM bir elemanın isim nasıl değiştirebilirim?

2 Cevap php

DOM PHP ile, ben bir elemanı temsil eden bir DomElement nesnesi var.

Ben bu yüzden onun öğe adı bu değiştirmeniz gereken bir durum var, ama aynı çocuk öğeleri ve nitelikleri tutun.

Ne DomElement unsuru adını değiştirerek ve çocuk ve özelliklerini tutmanın en basit yolu olurdu?

Edit: I have just found a very similar question (çok iyi cevabı yok gerçi).

2 Cevap

Eğer importNode(), yeni oluşturulan <person> elemanı için <identity> elemanın childNodes kopyalamak için kullanabilir miyim?

function changeName($node, $name) {
    $newnode = $node->ownerDocument->createElement($name);
    foreach ($node->childNodes as $child){
        $child = $node->ownerDocument->importNode($child, true);
        $newnode->appendChild($child, true);
    }
    foreach ($node->attributes as $attrName => $attrNode) {
        $newnode->setAttribute($attrName, $attrNode);
    }
    $newnode->ownerDocument->replaceChild($newnode, $node);
    return $newnode;
}

$domElement = changeName($domElement, 'person');

Belki de böyle bir şey çalışmak istiyorsunuz, yoksa cloneChild() kullanarak deneyebilirsiniz.

Edit: Aslında, ben sadece orijinal işlevi düğüm yerleştirme kaybedeceğini fark. Thomasrutter bağlantılı söz göre, replaceChild() kullanılmalıdır.

Yazınızın sayesinde, çabuk benim için aynı sorunu çözebilir. Ancak, ben bir DOM_NOT_FOUND istisna vardı. Orijinal sonrası 5 yaşında olduğu için bu, muhtemelen bir PHP Sürümü konudur.

PHP Dokümantasyon (Şubat 2014) göre,

DOM_NOT_FOUND
  Raised if oldnode is not a child of this node. 

Yani, yerini almış

$newnode->ownerDocument->replaceChild($newnode, $node);

ile

$node->parentNode->replaceChild($newnode, $node);

İşte tam fonksiyon (test) 'dir:

public static function changeTagName($node, $name) {
    $childnodes = array();
    foreach ($node->childNodes as $child){
        $childnodes[] = $child;
    }
    $newnode = $node->ownerDocument->createElement($name);
    foreach ($childnodes as $child){
        $child2 = $node->ownerDocument->importNode($child, true);
        $newnode->appendChild($child2);
    }
    foreach ($node->attributes as $attrName => $attrNode) {
        $newnode->setAttribute($attrName, $attrNode);
    }
    $node->parentNode->replaceChild($newnode, $node);
    return $newnode;
}

Size bu işlevi kullanmak istediğinizde diğer mesajlar açıklandığı şekilde, tersten DOM Ağacı çapraz gerektiğini de belirtmekte yarar var.