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 — 基底ノード型を作成する際に使用する拡張クラスを登録する
説明
bool DOMDocument::registerNodeClass
( string $baseclass
, string $extendedclass
)
このメソッドにより、独自に拡張した DOM クラスを登録することができます。 これを、後で PHP DOM 拡張モジュールで使用します。
このメソッドは、DOM の標準にはないものです。
パラメータ
- baseclass
-
拡張したい DOM クラス。クラス名の一覧は、 この章の導入部にあります。
- extendedclass
-
拡張したクラスの名前。NULL を渡した場合は、 それまでに baseclass を拡張して作成したすべてのクラスが削除されます。
返り値
成功した場合に TRUE を、失敗した場合に FALSE を返します。
変更履歴
| バージョン | 説明 |
|---|---|
| PHP 5.2.2 | 5.2.2 より前のバージョンでは、同一の baseclass を継承した新しいクラスを登録する際には、以前に登録されていた extendedclass の登録を解除する必要がありました。 |
例
例1 新しいメソッドを DOMElement に追加し、コードを書きやすくする
<?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');
// これ以降、他の要素への要素の追加が一回のメソッドコールでできるようになります!
$root = $doc->setRoot('root');
$child = $root->appendElement('child');
$child->setAttribute('foo', 'bar');
echo $doc->saveXML();
?>
上の例の出力は以下となります。
<?xml version="1.0"?> <root><child foo="bar"/></root>
例2 カスタムクラス形式での要素の取得
<?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 メソッドの助けを借ります..
echo $element;
?>
上の例の出力は以下となります。
string(9) "myElement" text in child
例3 オーナードキュメントの取得
自作の DOMDocument インスタンスを作成すると、 ownerDocument プロパティが作成元のクラスを指すようになります。 つまり DOMDocument の DOMDocument::registerNodeClass() を使う必要はない (実際、使えない) ということです。
<?php
class myDOMDocument extends DOMDocument {
}
class myOtherDOMDocument extends DOMDocument {
}
// XML から myDOMDocument を作成します
$doc = new myDOMDocument;
$doc->loadXML("<root><element><child>text in child</child></element></root>");
$child = $doc->getElementsByTagName("child")->item(0);
// このノードの現在のオーナーは myDOMDocument です
var_dump(get_class($child->ownerDocument));
// ノードを myDOMDocument からインポートします
$newdoc = new myOtherDOMDocument;
$child = $newdoc->importNode($child);
// ノードの新しいオーナーは myOtherDOMDocument に変わりました
var_dump(get_class($child->ownerDocument));
?>
上の例の出力は以下となります。
string(13) "myDOMDocument" string(18) "myOtherDOMDocument"
DOMDocument::registerNodeClass
crh3675 at gmail dot com
26-Sep-2009 12:23
26-Sep-2009 12:23
arnold at adaniels dot nl
23-Jul-2009 07:10
23-Jul-2009 07:10
Note than save and saveXML are not affected by __toString().
