XMLWriter ライブラリの奥深さを探る:XMLWriter::endElement 関数を中心に


XMLWriter::endElement 関数は、PHP の XML ライブラリで使用される関数であり、現在開かれている XML 要素を終了するために使用されます。この関数は、XMLWriter::startElement() 関数で開始された要素を閉じる役割を果たします。

構文

bool XMLWriter::endElement( void );

引数

この関数は引数を受け取りません。

戻り値

成功した場合、この関数は TRUE を返します。失敗した場合、FALSE を返します。

使用方法

XMLWriter::endElement 関数は、ネストされた XML 要素を適切に構造化するために使用されます。例えば、以下のコードは、"book" 要素とその子要素である "title" と "author" 要素を定義します。

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('book');
$xml->writeElement('title', 'The Hitchhiker\'s Guide to the Galaxy');
$xml->writeElement('author', 'Douglas Adams');
$xml->endElement(); // "book" 要素を終了
$xml->endDocument();
$xml->outputMemory();

このコードを実行すると、以下の XML が生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<book>
  <title>The Hitchhiker's Guide to the Galaxy</title>
  <author>Douglas Adams</author>
</book>

XMLWriter::fullEndElement 関数との違い

XMLWriter::endElement 関数と類似した関数として、XMLWriter::fullEndElement() 関数があります。この関数は、要素の内容にかかわらず、常に終了タグ (</element>) を書き込みます。一方、XMLWriter::endElement() 関数は、要素の内容が空の場合、短縮形終了タグ (/>) を書き込みます。



例 1: 単純な要素

この例では、"book" 要素とその子要素である "title" と "author" 要素を定義します。

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('book');
$xml->writeElement('title', 'The Hitchhiker\'s Guide to the Galaxy');
$xml->writeElement('author', 'Douglas Adams');
$xml->endElement(); // "book" 要素を終了
$xml->endDocument();
$xml->outputMemory();
<?xml version="1.0" encoding="UTF-8"?>
<book>
  <title>The Hitchhiker's Guide to the Galaxy</title>
  <author>Douglas Adams</author>
</book>

例 2: 属性付き要素

この例では、"book" 要素に "id" 属性を追加します。

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('book', array('id' => 123));
$xml->writeElement('title', 'The Hitchhiker\'s Guide to the Galaxy');
$xml->writeElement('author', 'Douglas Adams');
$xml->endElement(); // "book" 要素を終了
$xml->endDocument();
$xml->outputMemory();
<?xml version="1.0" encoding="UTF-8"?>
<book id="123">
  <title>The Hitchhiker's Guide to the Galaxy</title>
  <author>Douglas Adams</author>
</book>

例 3: ネストされた要素

この例では、"book" 要素の中に "chapter" 要素をネストします。

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('book');
$xml->startElement('chapter');
$xml->writeElement('title', 'The Quest for the Infinite Improbability Drive');
$xml->writeElement('content', 'Ford Prefect and Arthur Dent embark on a journey to find the Infinite Improbability Drive...');
$xml->endElement(); // "chapter" 要素を終了
$xml->endElement(); // "book" 要素を終了
$xml->endDocument();
$xml->outputMemory();
<?xml version="1.0" encoding="UTF-8"?>
<book>
  <chapter>
    <title>The Quest for the Infinite Improbability Drive</title>
    <content>Ford Prefect and Arthur Dent embark on a journey to find the Infinite Improbability Drive...</content>
  </chapter>
</book>

例 4: 名前空間付き要素

この例では、"book" 要素に名前空間を指定します。

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument('1.0', 'UTF-8');
$xml->setIndent(true);
$xml->xmlns('http://example.com/books', 'bk');
$xml->startElement('bk:book');
$xml->writeElement('bk:title', 'The Hitchhiker\'s Guide to the Galaxy');
$xml->writeElement('bk:author', 'Douglas Adams');
$xml->endElement(); // "book" 要素を終了
$xml->endDocument();
$xml->outputMemory();
<?xml version="1.0" encoding="UTF-8"?>
<bk:book xmlns:bk="http://example.com/books">
  <bk:title>The Hitchhiker's Guide to the Galaxy</bk:title>
  <bk:author>Douglas Adams</bk:author>
</bk:book>


しかし、状況によっては、代替的なアプローチ で同様の結果を得ることが可能です。以下に、いくつかの代替案をご紹介します。

XMLWriter::fullEndElement 関数を使用する

XMLWriter::fullEndElement() 関数は、XMLWriter::endElement() 関数と似ていますが、常に終了タグ (</element>) を書き込みます。一方、XMLWriter::endElement() 関数は、要素の内容が空の場合、短縮形終了タグ (/>) を書き込みます。

そのため、要素の内容が常に空であることがわかっている場合は、XMLWriter::fullEndElement() 関数を使用することで、XMLWriter::endElement() 関数の呼び出しを省略することができます。

$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('emptyElement');
$xml->fullEndElement(); // 常に終了タグ `</emptyElement>` を書き込む
$xml->endDocument();
$xml->outputMemory();
<?xml version="1.0" encoding="UTF-8"?>
<emptyElement></emptyElement>

DOMDocument ライブラリを使用する

DOMDocument ライブラリは、XML ドキュメントを操作するための別の方法を提供します。このライブラリを使用して、要素を明示的に終了させることができます。

$doc = new DOMDocument();
$doc->loadXML('<book><title>The Hitchhiker\'s Guide to the Galaxy</title></book>');
$bookElement = $doc->getElementsByTagName('book')->item(0);
$titleElement = $bookElement->getElementsByTagName('title')->item(0);
$titleElement->removeChild($titleElement->firstChild); // 要素の内容を削除
$bookElement->removeChild($titleElement); // 要素を削除
$doc->saveXML();
echo $doc->saveHTML();
<?xml version="1.0" encoding="UTF-8"?>
<book></book>

SimpleXML ライブラリを使用する

SimpleXML ライブラリは、XML ドキュメントをオブジェクトとして表現する別の方法を提供します。このライブラリを使用して、要素を明示的に終了させることができます。

$xml = simplexml_load_string('<book><title>The Hitchhiker\'s Guide to the Galaxy</title></book>');
$book = $xml->book;
$title = $book->title;
unset($title->content); // 要素の内容を削除
unset($book->title); // 要素を削除
echo $xml->asXML();
<book></book>

注意点

上記で紹介した代替方法は、それぞれ異なるユースケースに適しています。どの方法が最適かは、具体的な状況によって異なります。

また、これらの方法は、パフォーマンスメモリ使用量 の面で XMLWriter::endElement() 関数よりも劣る場合があることに注意する必要があります。