Creating innerHTML and outerHTML
<?php
class DOMHTMLElement extends DOMElement
{
function __construct() { parent::__construct();}
public function innerHTML()
{
$doc = new DOMDocument();
foreach ($this->childNodes as $child){
$doc->appendChild($doc->importNode($child, true));
}
$content = $doc->saveHTML();
return $content;
}
public function outerHTML()
{
$doc = new DOMDocument();
$doc->appendChild($doc->importNode($this, true));
$content = $doc->saveHTML();
return $content;
}
}
$dom = DOMDocument::loadHTMLFile($file);
$dom->registerNodeClass('DOMElement','DOMHTMLElement');
if($dom)
{
$xpath = new DOMXpath($dom);
$regions = $xpath->query("//*[contains(@class, 'editable')]");
$content = '';
foreach($regions as $region){
$content .= $region->outerHTML();
}
return $content;
}else{
throw new Exception('Cannot parse HTML. Please verify the syntax is correct.');
}
?>
DOMDocument::registerNodeClass
(PHP 5 >= 5.2.0)
DOMDocument::registerNodeClass — Temel düğüm türünü oluşturmakta kullanılacak türetilmiş sınıfı belirtmek için kullanılır
Açıklama
$temelSınıf
, string $türetilenSınıf
)Sonradan PHP DOM eklentisi tarafından kullanılmak üzere hazırladığınız kendi DOM sınıfınızı tanıtmanızı sağlar.
Bu yöntem DOM standardının bir parçası değildir.
Değiştirgeler
-
temelSınıf -
Kendi sınıfınızı türetirken kullandığınız temel sınıfın ismi. Bu sınıfların listesi için bakınız: DOM.
-
türetilenSınıf -
Türettiğiniz sınıfın ismi.
NULLbelirtilirse,temelSınıf'tan evvelce türetilen sınıf silinir.
Dönen Değerler
Başarı durumunda TRUE, başarısızlık durumunda FALSE döner.
Sürüm Bilgisi
| Sürüm: | Açıklama |
|---|---|
| PHP 5.2.2 |
5.2.2 öncesinde, temelSınıf'tan evvelce
türetilmiş bir sınıf varsa yenisinin kaydı yapılmadan önce eskisinin
kaydı silinmek zorundaydı.
|
Örnekler
Örnek 1 - Kolaylık olsun diye DOMElement sınıfına yeni bir yöntem eklemek
<?php
class myElement extends DOMElement {
function appendElement($name) {
return $this->appendChild(new myElement($name));
}
}
class myDocument extends DOMDocument {
function setRoot($name) {
return $this->appendChild(new myElement($name));
}
}
$doc = new myDocument();
$doc->registerNodeClass('DOMElement', 'myElement');
// Artık bir elemanı diğerine eklemek için bir yöntem yetecek!
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');
echo $doc->saveXML();
?>
Yukarıdaki örneğin çıktısı:
<?xml version="1.0"?> <root><child foo="bar"/></root>
Örnek 2 - Elemanların özel bir sınıf olarak döndürülmesi
<?php
class myElement extends DOMElement {
public function __toString() {
return $this->nodeValue;
}
}
$doc = new DOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");
$doc->registerNodeClass("DOMElement", "myElement");
$element = $doc->getElementsByTagName("child")->item(0);
var_dump(get_class($element));
// __toString yönteminden yararlanalım
echo $element;
?>
Yukarıdaki örneğin çıktısı:
string(9) "myElement" text in child
Örnek 3 - Asıl belgeyi döndürmek
DOMDocument sınıfına özgü olarak, sınıf örneklenirken sınıfın ownerDocument özelliği örneklenen sınıfı gösterecektir. Yani, DOMDocument sınıfı için DOMDocument::registerNodeClass() yönteminin kullanımına aslında gerek yoktur.
<?php
class myDOMDocument extends DOMDocument {
}
class myOtherDOMDocument extends DOMDocument {
}
// myDOMDocument nesnesini XML belge olarak oluşturalım
$doc = new myDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");
$child = $doc->getElementsByTagName("child")->item(0);
// Düğümün sahibi myDOMDocument nesnesidir
var_dump(get_class($child->ownerDocument));
// myDOMDocument nesnesinden bir düğüm alalım
$newdoc = new myOtherDOMDocument;
$child = $newdoc->importNode($child);
// Düğümün sahibi artık myOtherDOMDocument nesnesi oldu
var_dump(get_class($child->ownerDocument));
?>
Yukarıdaki örneğin çıktısı:
string(13) "myDOMDocument" string(18) "myOtherDOMDocument"
