サーチ…
XMLWriterを使用してXMLファイルを作成する
XMLWriterオブジェクトをインスタンス化する:
$xml = new XMLWriter();
次に、書きたいファイルを開きます。たとえば、 /var/www/example.com/xml/output.xml
に書き込むには、次のようにします。
$xml->openUri('file:///var/www/example.com/xml/output.xml');
ドキュメントを開始するには(XMLオープンタグを作成します):
$xml->startDocument('1.0', 'utf-8');
これは出力されます:
<?xml version="1.0" encoding="UTF-8"?>
これで要素を書くことができます:
$xml->writeElement('foo', 'bar');
これによりXMLが生成されます:
<foo>bar</foo>
プレーンな値を持つ単純なノードよりも複雑なものが必要な場合は、要素を閉じる前に要素を「開始」して属性を追加することもできます。
$xml->startElement('foo');
$xml->writeAttribute('bar', 'baz');
$xml->writeCdata('Lorem ipsum');
$xml->endElement();
これは出力されます:
<foo bar="baz"><![CDATA[Lorem ipsum]]></foo>
DOMDocumentを使ってXML文書を読む
SimpleXMLと同様に、DOMDocumentを使用して、文字列またはXMLファイルからXMLを解析できます
1.文字列から
$doc = new DOMDocument();
$doc->loadXML($string);
2.ファイルから
$doc = new DOMDocument();
$doc->load('books.xml');// use the actual file path. Absolute or relative
解析の例
以下のXMLを考慮して:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>PHP - An Introduction</name>
<price>$5.95</price>
<id>1</id>
</book>
<book>
<name>PHP - Advanced</name>
<price>$25.00</price>
<id>2</id>
</book>
</books>
これは解析するためのコード例です
$books = $doc->getElementsByTagName('book');
foreach ($books as $book) {
$title = $book->getElementsByTagName('name')->item(0)->nodeValue;
$price = $book->getElementsByTagName('price')->item(0)->nodeValue;
$id = $book->getElementsByTagName('id')->item(0)->nodeValue;
print_r ("The title of the book $id is $title and it costs $price." . "\n");
}
これは出力されます:
本のタイトルはPHP - Introductionで、価格は$ 5.95です。
本2のタイトルはPHP - Advancedで、価格は$ 25.00です。
DomDocumentを使用してXMLを作成する
DOMDocumentを使用してXMLを作成するには、基本的に、我々はすべてのタグを作成する必要があり、使用して属性createElement()
およびcreateAttribute()
メソッドを、それらを使用してXML構造を作成しますappendChild()
。
以下の例には、タグ、属性、CDATAセクション、および2番目のタグの異なる名前空間が含まれています。
$dom = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
//create the main tags, without values
$books = $dom->createElement('books');
$book_1 = $dom->createElement('book');
// create some tags with values
$name_1 = $dom->createElement('name', 'PHP - An Introduction');
$price_1 = $dom->createElement('price', '$5.95');
$id_1 = $dom->createElement('id', '1');
//create and append an attribute
$attr_1 = $dom->createAttribute('version');
$attr_1->value = '1.0';
//append the attribute
$id_1->appendChild($attr_1);
//create the second tag book with different namespace
$namespace = 'www.example.com/libraryns/1.0';
//include the namespace prefix in the books tag
$books->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns', $namespace);
$book_2 = $dom->createElementNS($namespace,'ns:book');
$name_2 = $dom->createElementNS($namespace, 'ns:name');
//create a CDATA section (that is another DOMNode instance) and put it inside the name tag
$name_cdata = $dom->createCDATASection('PHP - Advanced');
$name_2->appendChild($name_cdata);
$price_2 = $dom->createElementNS($namespace, 'ns:price', '$25.00');
$id_2 = $dom->createElementNS($namespace, 'ns:id', '2');
//create the XML structure
$books->appendChild($book_1);
$book_1->appendChild($name_1);
$book_1->appendChild($price_1);
$book_1->appendChild($id_1);
$books->appendChild($book_2);
$book_2->appendChild($name_2);
$book_2->appendChild($price_2);
$book_2->appendChild($id_2);
$dom->appendChild($books);
//saveXML() method returns the XML in a String
print_r ($dom->saveXML());
これにより、次のXMLが出力されます。
<?xml version="1.0" encoding="utf-8"?>
<books xmlns:ns="www.example.com/libraryns/1.0">
<book>
<name>PHP - An Introduction</name>
<price>$5.95</price>
<id version="1.0">1</id>
</book>
<ns:book>
<ns:name><![CDATA[PHP - Advanced]]></ns:name>
<ns:price>$25.00</ns:price>
<ns:id>2</ns:id>
</ns:book>
</books>
SimpleXMLでXML文書を読む
文字列またはXMLファイルからXMLを解析できます
1.文字列から
$xml_obj = simplexml_load_string($string);
2.ファイルから
$xml_obj = simplexml_load_file('books.xml');
解析の例
以下のXMLを考慮して:
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>PHP - An Introduction</name>
<price>$5.95</price>
<id>1</id>
</book>
<book>
<name>PHP - Advanced</name>
<price>$25.00</price>
<id>2</id>
</book>
</books>
これは解析するためのコード例です
$xml = simplexml_load_string($xml_string);
$books = $xml->book;
foreach ($books as $book) {
$id = $book->id;
$title = $book->name;
$price = $book->price;
print_r ("The title of the book $id is $title and it costs $price." . "\n");
}
これは出力されます:
本のタイトルはPHP - Introductionで、価格は$ 5.95です。
本2のタイトルはPHP - Advancedで、価格は$ 25.00です。
PHPのSimpleXMLライブラリでのXML活用
SimpleXMLは、XML文字列を使いやすいPHPオブジェクトに変換する強力なライブラリです。
以下では、XML構造を前提としています。
<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</document>
SimpleXMLへのデータの読み込み
まず、データをSimpleXMLに読み込む必要があります。我々は3つの異なる方法でこれを行うことができます。まず、 DOMノードからデータをロードできます。
$xmlElement = simplexml_import_dom($domNode);
次のオプションは、XMLファイルからデータをロードすることです。
$xmlElement = simplexml_load_file($filename);
最後に、 変数からデータを読み込むことができます。
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</document>';
$xmlElement = simplexml_load_string($xmlString);
DOM要素 、 ファイル、または文字列からロードするかどうかに関係なく、 $xmlElement
というSimpleXMLElement変数が残っています。さて、PHPでXMLを利用することができます。
SimpleXMLデータへのアクセス
SimpleXMLElementオブジェクトのデータにアクセスする最も簡単な方法は、プロパティを直接呼び出すことです。最初のbookName、 StackOverflow SimpleXML Example
にアクセスする場合は、以下のようにアクセスできます。
echo $xmlElement->book->bookName;
この時点で、SimpleXMLは、どの書籍を望んでいるかを明示していないため、最初のものを必要としていると仮定します。しかし、最初のAnother SimpleXML Example
を望んでいないと判断した場合、 Another SimpleXML Example
が必要な場合は、次のようにアクセスできます。
echo $xmlElement->book[1]->bookName;
[0]
を使用することは、それを使用しないのと同じように動作することに注意する価値があります。
$xmlElement->book
同じ
$xmlElement->book[0]
XMLをループする
XMLをループする理由はたくさんあります 。例えば、私たちの場合にはウェブページに表示したい数のアイテムがあります。このために 、 SimpleXMLElementのcount関数を利用して、 foreachループまたは標準forループを使用できます。 。
foreach ( $xmlElement->book as $thisBook ) {
echo $thisBook->bookName
}
または
$count = $xmlElement->count();
for ( $i=0; $i<$count; $i++ ) {
echo $xmlElement->book[$i]->bookName;
}
エラーの処理
これまでのところ、私たちは人間であることを認識することが重要で、最終的にはエラーが発生する可能性があります。特に、常に異なるXMLファイルを使用している場合は特にそうです。したがって、これらのエラーを処理したいと考えています。
XMLファイルを作成したとします。このXMLは以前と同じようなものですが、このXMLファイルの問題は、最後の終了タグが/ documentではなく/ docであることです。
<?xml version="1.0" encoding="UTF-8"?>
<document>
<book>
<bookName>StackOverflow SimpleXML Example</bookName>
<bookAuthor>PHP Programmer</bookAuthor>
</book>
<book>
<bookName>Another SimpleXML Example</bookName>
<bookAuthor>Stack Overflow Community</bookAuthor>
<bookAuthor>PHP Programmer</bookAuthor>
<bookAuthor>FooBar</bookAuthor>
</book>
</doc>
さて、これをPHPの$ fileにロードします。
libxml_use_internal_errors(true);
$xmlElement = simplexml_load_file($file);
if ( $xmlElement === false ) {
$errors = libxml_get_errors();
foreach ( $errors as $thisError ) {
switch ( $thisError->level ) {
case LIBXML_ERR_FATAL:
echo "FATAL ERROR: ";
break;
case LIBXML_ERR_ERROR:
echo "Non Fatal Error: ";
break;
case LIBXML_ERR_WARNING:
echo "Warning: ";
break;
}
echo $thisError->code . PHP_EOL .
'Message: ' . $thisError->message . PHP_EOL .
'Line: ' . $thisError->line . PHP_EOL .
'Column: ' . $thisError->column . PHP_EOL .
'File: ' . $thisError->file;
}
libxml_clear_errors();
} else {
echo 'Happy Days';
}
私たちは次のように挨拶されます
FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc
Line: 13
Column: 10
File: filepath/filename.xml
しかし、この問題を解決するとすぐに「ハッピーデイズ」が表示されます。