個人メモ＠PHPでのXML

#表題の件
タイトルの意図としてはDOMを想定して書いています。XMLについては多分一切触れません。
個人用のメモなので見難いと思いますが勉強の為に書き起こすので許してください。

#XMLを出力させるにはDOM
##DOMとは
DOMとは、Document Object Modelの略です。説明としては以下のようになっています。

>XMLやHTMLで記述された文書をプログラムやスクリプトから参照あるいは操作するための方法を提供する仕組み。
>XMLやHTMLで記述された文書の要素や属性を利用して構造化する方法などが定義されている。
>DOMはDynamic HTMLで利用され、Webページ上の文字のスタイルを動的に変化させたり、表示後のWebページに画像を挿入したりするといったことを実現できる。
(出典:http://yougo.ascii.jp/caltar/DOM)

自分はHTML出力を容易に行いたいので最低限使えそうな事を記述していきます。
##phpでDOMを扱う
phpでこのDOMを扱うには次のようにオブジェクトを用いて扱う。
以下はhtml文を出力させる一例。

```php:DOM
<?
    $doc = new DOMDocument('1.0');
    $root = $doc -> createElement('html');
    $root = $doc -> appendChild($root);
    $root = $doc -> createElement('head');
    $root = $doc -> appendChild($root);
    $root = $doc -> creadElement('title');
    $root = $doc -> appendChild($root);
    $text = $doc -> createTextNode('This is the title');
    $text = $title ->appendChild($root);

    echo $text -> saveHTML();
```

(出典:http://php.net/manual/ja/domdocument.savehtml.php)
echoで出力される文字列は以下のような出力になる。

```html:sample
<html><head><title>This is the title</title></head></html>
```

##関数の役割
上記のコード内のそれぞれの関数の役割は見ればなんとなくわかると思うが、多分思ったことそのままだと思う。
<code>new DOMDocument('1.0')</code>はDOMDocumentオブジェクトを生成している。
この<code>DOMDocument</code>のコンストラクタは次のようになっている。

```php:DOMDocument
DOMDocument::__construct ([string $version,[string $encoding]])
```

(出典:http://php.net/manual/ja/domdocument.construct.php)
<font color=red>\$version</font>は<font color=red>XMLドキュメントのバージョン</font>（上記の例だと1.0）、<font color=green>$encoding</font>には生成する<font color=green>ドキュメントのエンコーディング</font>を指定する。

<code>createElement</code>はDOMDocument内にて定義されている関数で、次のようになっている。

```php:createElement
public DOMElement DOMDocument::createElement (string $name [, string $value])
```

返り値の型になっているDOMElementは気にしなくていいと思う。というか調べたら分かるのでわざわざ深く（？）掘り下げるのは無駄だと思いました（理解していないため）。
<font color=red>\$name</font>には追加する要素（htmlで言うところの<font color=red>タグ</font>)を指定、<font color=green>$value</font>には<font color=green>値</font>を指定する。

次は<code>appendChild</code>。これもコードを読んだらだいたい把握はつくのだが、実際に値として書き出していると思っていい（と思う）。
内容としては次のようになっている。

```php:appendChild
public DOMNode DOMNode::apppendChild (DOMNode $newnode)
```

（出典:http://php.net/manual/en/domnode.appendchild.php）
イメージとしては<code>createElement</code>で作成した値を<font color=orange>$newnode</font>に設定して<code>DOMDocument</code>オブジェクトに出力している感じ。

次は<code>createTextNode</code>。これも上記の例を見たらだいたいわかると思う。定義としては次の通り。

```php::createTextNode
public DOMText DOMDocument::createTextNode (string $content)
```
出典（http://php.net/manual/ja/domdocument.createtextnode.php）
DOMText型になっているが気にしなくていいかも。というかほぼ気にしてなくても大体流れさえあってれば動くから気になるなら調べる程度の認識でいい。気がする。
引数の<font color=orange>$content</font>には値を記入。

最後に<code>saveHTML</code>。
これも上記の例でわかると思うが、指定したDOMDocumentを実際にhtmlとして書き出している。ファイルを保存したりするセーブとは少し違う意味のsaveかな。
まあ賢いフレンズさんはこんな事言わずとも理解できますが。。。
次のように定義されています。

```php::saveHTML
public string DOMDocument::saveHTML ([DOMNode $node = NULL])
```
出典（http://php.net/manual/ja/domdocument.savehtml.php）
引数は気にしたらだめっす。
#まとめ
phpでhtmlを綺麗に出したいなーと思った時、自前で関数を作成したりして出力させるのもありですが、DOMはかなり便利なので有効活用していきましょう。
既にある便利なモノは有効活用する。自分で作り出すのは後からでもいいんです。

正直これだけあれば普通にまともなhtml出せそうだなと思うから怖いけどそういう事は気にしたらダメかも。
過去に実際に動かしたような動かしてないような記憶がありますが、appendChildをしていくとどんどん入れ子になっていきます。
例えば、<code>\<span>test\</span></code>をhtmlとして出力させたい時は

```php:test
$dom = new DOMDocument('1.0');
$span = $dom->createElement('span');
$text = $dom->createTextNode('test');
$text = $span->appendChild($span);
echo $text->saveHTML();
```

とすればいいとも思います。動かしてないので動くかはわかりませんが動かなくても知りません。

総まとめとしては、htmlを扱うだけなら、
<code>new DOMDocument</code>
<code>createElement</code>
<code>createTextNode</code>
<code>appendChild</code>
<code>saveHTML</code>
を知っていればいいと思います。属性を指定する<code>createAttr</code>もありますが、同じような使い方なので今回は省きます。

以上です。あくまでも自分の頭の中の整理用のメモなので見辛いのは許してください。
閲覧有り難うございました。