PHP DOM - yeni eklenen imkanı olacak düğümleri

2 Cevap php

Ben DOM'ye bir html belge almak için aşağıdakileri kullanabilirsiniz:

$dom = new domDocument('1.0', 'utf-8');
$dom->loadHTML($html)

ve sonra ben html bir öğe için bazı yeni içerik eklemek:

$element = $dom->getElementById('mybox');
$f = $dom->createDocumentFragment();
$f->appendXML('<div id="newbox">foo</div>');
$element->appendChild($f);

Ben şimdi # newbox işlemek isterseniz ben getElementById() ile erişemez çünkü Ama, ben bunu yapamam. Ben (yeni html ile yeniden) aşağıdakileri yapmak zorunda yapmak amacıyla:

$html = $dom->saveHTML();
$dom->loadHTML($html)

Çalışıyor, ama her dom manipülasyon arasındaki bu yapmak zorunda olduğunda, performans-bilge pahalı hale geldiği.

Bu yeni eklenen elemanlar ile çalışır, böylece DOM "yenilemek" için daha iyi bir yolu var mı?

Şimdiden teşekkürler! :)

2 Cevap

Save-ve-yük yaklaşım, aynı zamanda Document.normalizeDocument . This should fix up the document as if it had been save-cycled, without actually really serialising. One thing that should do would be to re-calculate the isID -ness of attributes from the document type, which you'd hope (ki ([{define HTML DOCTYPE birine ayarlanmış olurdu deneyebilirsiniz 3)]} tarafından değer türü kimliği bir nitelik) olarak loadHTML.

(Orada Element.setIdAttribute which can be used to declare one instance of an Attr bir kimliği içermesi de, ancak ilk önce ele almak olurdu beri size faydası yok.)

Ben bu olsa test değil ve PHP doğru bu DOM Düzey 3 Çekirdek şeyler uygulamak vermedi eğer bana sürpriz olmaz. Benim yorumuyla the spec for isId , I reckon it should have picked up the id zaten otomatik olarak tanımını yazın. (Benim kendi DOM uygulama kesinlikle. Yapar) Ama bu durumda kod çalışmış olurdu. Ve ben appendXML sonra tüm standart olmayan bir yöntem olduğunu, bu nedenle loadXML veya loadHTML yaptığınız gibi tip tanımları çözmek zorundadır söyleyecek bir şey yok herhalde.

Yani, belki geçici bir çözüm daha iyi bir plan. Sen @id ziyade gibi gerçek IDness daha özniteliği tarafından elemanı seçmek için DOMXPath kullanabilirsiniz. Tabii ki bu getElementById daha yavaş olacaktır, ancak normalizeDocument daha hızlı umarım.

Ya da sadece XML dizesi-sıçramasını kaybetmek ve eğer yapabilirsen, DOM yöntemlere sadık; o bir oluşturulan elemanın bir başvuru tutmak için önemsiz bulunuyor. (Eğer oluştururken içerik miktarı için DOM yöntemleri çok söz bulmak eğer biraz daha hızlı unsurları oluşturmak için yardımcı işlevlerini kullanabilirsiniz.)

Ben çok iyi idare edebilir biliyor tek şey .. Beautifuly Python güzel çorbadır. DOM tüm eklemek veya at html işlemek için bir python komut dosyası yazmak ve daha sonra veritabanı veya sistem çağrısı tarafından komut koordine edebilir mabey olacak götürmek bir ayrıştırma ağacında bölünmüş olduğunu. alternatif sunucu tarafı javascript araştırmaya değer olabilir.