PHPプログラマーのためのXMLWriter::writeElementNsチュートリアル


XMLWriter::writeElementNs 関数は、名前空間付き XML 要素を生成するために使用されます。名前空間は、XML 文書内の要素と属性を一意に識別するメカニズムです。この関数は、要素名、名前空間接頭辞、名前空間 URI、および要素コンテンツを含む完全な名前空間付き要素タグを書き込みます。

構文

bool XMLWriter::writeElementNs(string $localName, string $ns, string $uri, string $content = NULL);

パラメータ

  • $content: 要素コンテンツ(オプション)
  • $uri: 名前空間 URI
  • $ns: 名前空間接頭辞
  • $localName: 要素名

戻り値

成功した場合に TRUE、失敗した場合に FALSE を返します。

<?php

$xml = new XMLWriter();
$xml->openMemory();
$xml->setIndent(true);

$xml->startDocument();
$xml->writeElementNs('person', 'xsi', 'http://www.w3.org/2001/XMLSchema-instance', '');

$xml->writeElement('name', '', '', 'John Doe');
$xml->writeElement('age', '', '', '30');

$xml->endElement();
$xml->endDocument();

$xmlOutput = $xml->outputMemory();

echo $xmlOutput;

この例では、次の XML 文書が生成されます。

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <name>John Doe</name>
  <age>30</age>
</person>
  • 要素コンテンツは、XML エスケープ処理されます。
  • 要素名は、XML 名前空間仕様に準拠している必要があります。
  • 名前空間接頭辞と名前空間 URI は、XML 名前空間仕様に準拠している必要があります。
  • 要素コンテンツが省略されている場合は、空文字列 ('') を渡します。
  • 名前空間 URI が省略されている場合は、空文字列 ('') を渡します。
  • 名前空間接頭辞が省略されている場合は、空文字列 ('') を渡します。
  • 名前空間付き XML を扱う場合は、XML 名前空間仕様をよく理解しておくことが重要です。
  • この説明は、XMLWriter::writeElementNs 関数の基本的な使用方法のみをカバーしています。より複雑な使用方法については、PHP マニュアルを参照してください。


例 1: 属性付きの名前空間付き要素

この例では、属性付きの名前空間付き要素を生成する方法を示します。

<?php

$xml = new XMLWriter();
$xml->openMemory();
$xml->setIndent(true);

$xml->startDocument();
$xml->writeElementNs('person', 'xsi', 'http://www.w3.org/2001/XMLSchema-instance', '');

$xml->writeAttribute('id', '123');
$xml->writeElement('name', '', '', 'John Doe');
$xml->writeElement('age', '', '', '30');

$xml->endElement();
$xml->endDocument();

$xmlOutput = $xml->outputMemory();

echo $xmlOutput;
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="123">
  <name>John Doe</name>
  <age>30</age>
</person>

例 2: サブ要素付きの名前空間付き要素

この例では、サブ要素付きの名前空間付き要素を生成する方法を示します。

<?php

$xml = new XMLWriter();
$xml->openMemory();
$xml->setIndent(true);

$xml->startDocument();
$xml->writeElementNs('person', 'xsi', 'http://www.w3.org/2001/XMLSchema-instance', '');

$xml->writeElement('name', '', '', 'John Doe');

$xml->startElementNs('address', '', 'http://example.com/address');
$xml->writeElement('street', '', '', '123 Main Street');
$xml->writeElement('city', '', '', 'Anytown');
$xml->writeElement('state', '', '', 'CA');
$xml->writeElement('zip', '', '', '98765');
$xml->endElement();

$xml->writeElement('age', '', '', '30');

$xml->endElement();
$xml->endDocument();

$xmlOutput = $xml->outputMemory();

echo $xmlOutput;
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <name>John Doe</name>
  <address xmlns="http://example.com/address">
    <street>123 Main Street</street>
    <city>Anytown</city>
    <state>CA</state>
    <zip>98765</zip>
  </address>
  <age>30</age>
</person>

例 3: デフォルトのネームスペース

この例では、デフォルトのネームスペースを使用して名前空間付き要素を生成する方法を示します。

<?php

$xml = new XMLWriter();
$xml->openMemory();
$xml->setIndent(true);

$xml->startDocument();
$xml->setDefaultNamespace('http://www.example.com');

$xml->writeElement('person', 'name', 'John Doe');
$xml->writeElement('person', 'age', '30');

$xml->endDocument();

$xmlOutput = $xml->outputMemory();

echo $xmlOutput;
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns="http://www.example.com">
  <name>John Doe</name>
  <age>30</age>
</person>


XMLWriter::startElementNs と XMLWriter::writeElement の組み合わせ

この方法は、XMLWriter::writeElementNs 関数とほぼ同じ結果を達成できますが、より多くのコード行を必要とします。

<?php

$xml = new XMLWriter();
$xml->openMemory();
$xml->setIndent(true);

$xml->startDocument();

$xml->startElementNs('person', 'xsi', 'http://www.w3.org/2001/XMLSchema-instance', '');

$xml->writeElement('name', '', '', 'John Doe');
$xml->writeElement('age', '', '', '30');

$xml->endElement();
$xml->endDocument();

$xmlOutput = $xml->outputMemory();

echo $xmlOutput;

長所

  • より柔軟性があります。要素内に属性を追加したり、サブ要素をネストしたりすることができます。

短所

  • XMLWriter::writeElementNs 関数よりも冗長です。

DOMDocument を使用する

DOMDocument は、XML ドキュメントを操作するためのもう 1 つの方法です。 XMLWriter よりも複雑ですが、より強力で柔軟性があります。

<?php

$doc = new DOMDocument();
$doc->version = '1.0';
$doc->encoding = 'UTF-8';

$person = $doc->createElementNS('http://www.w3.org/2001/XMLSchema-instance', 'person');

$name = $doc->createElement('name');
$name->textContent = 'John Doe';
$person->appendChild($name);

$age = $doc->createElement('age');
$age->textContent = '30';
$person->appendChild($age);

$doc->appendChild($person);

$xml = $doc->saveXML();

echo $xml;

長所

  • 非常に強力で柔軟性があります。複雑な XML ドキュメントを操作できます。

短所

  • XMLWriter よりも習得が難しく、処理速度も遅くなります。

SimpleXML を使用する

SimpleXML は、XML ドキュメントを操作するためのシンプルな API を提供します。 XMLWriterDOMDocument よりも軽量で使いやすいですが、機能も制限されています。

<?php

$xml = simplexml_load_string('<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></person>');

$xml->addChild('name', 'John Doe');
$xml->addChild('age', '30');

$xmlString = $xml->asXML();

echo $xmlString;

長所

  • 軽量で使いやすいです。

短所

  • 機能が制限されています。複雑な XML ドキュメントを操作するには適していません。

XMLWriter::writeElementNs 関数は、名前空間付き XML 要素を生成するための便利なツールですが、状況によっては代替手段の方が適切な場合があります。 上記の代替手段をそれぞれ検討し、ニーズに合ったものを選択してください。

  • シンプルで使いやすい API を必要とする場合は、SimpleXML が最良の選択肢となる可能性があります。
  • 複雑な XML ドキュメントを操作する必要がある場合は、DOMDocument が最良の選択肢となる可能性があります。
  • パフォーマンスが重要な場合は、XMLWriter が最良の選択肢となる可能性があります。