XML操作SimpleXML 関数
- SimpleXMLElement::addAttribute
〔SimpleXML要素に属性を追加する〕
- SimpleXMLElement::addChild
〔XMLノードに子要素を追加する〕
- SimpleXMLElement::asXML
〔SimpleXML要素に基づいて整形式のXML文字列を返す〕
- SimpleXMLElement::attributes
〔要素の属性を定義する〕
- SimpleXMLElement::children
〔指定したノードの子ノードを見つける〕
- SimpleXMLElement::__construct
〔新しいSimpleXMLElementオブジェクトを生成する〕
- SimpleXMLElement::getDocNamespaces
〔ドキュメントで宣言されている名前空間を返す〕
- SimpleXMLElement::getName
〔XML要素の名前を取得する〕
- SimpleXMLElement::getNamespaces
〔ドキュメントで使用している名前空間を返す〕
- SimpleXMLElement::registerXPathNamespace
〔次のXPathクエリ用のprefix/nsコンテキストを作成する〕
- SimpleXMLElement::xpath
〔XMLデータにXpathクエリを実行する〕
- simplexml_import_dom
〔DOMノードからSimpleXMLElementオブジェクトを取得する〕
- simplexml_load_file
〔XMLファイルをパースしてオブジェクトに代入する〕
- simplexml_load_string
〔XML文字列をオブジェクトに代入する〕
SimpleXMLElement::addAttribute 
SimpleXML要素に属性を追加する
unknown
SimpleXML要素に属性名の属性とその属性の値を追加します。 オプションの第3引数名前空間を指定した場合は、その属性が属する名前空間に追加します。 返り値はありません。
<?
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books>
<book date="unknown" price="unknown">PHP関連のおすすめ書籍</book>
<book date="20081031" price="1995">まるごとPHP! Vol.2</book>
<book date="20080918" price="2940">PHP×携帯サイト デベロッパーズバイブル</book>
<book date="20080618" price="2604" >CakePHP ポケットリファレンス</book>
<book date="20080526" price="3570">初めてのPHP & MySQL 第2版</book>
<book date="20080125" price="2520">PHPライブラリコレクション</book>
</books>
*/
# XMLファイルを読み込む
$xml=simplexml_load_file("/content/demo/book.xml");
# 最初のitem要素の属性を削除
unset($xml->book[0][price]);
# XMLファイルに書き込む
$xml->asXML("/content/demo/book.xml");
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>PHP関連のおすすめ書籍</book>
<book date="20081031" price="1995">まるごとPHP! Vol.2</book>
<book date="20080918" price="2940">PHP×携帯サイト デベロッパーズバイブル</book>
<book date="20080618" price="2604">CakePHP ポケットリファレンス</book>
<book date="20080526" price="3570">初めてのPHP & MySQL 第2版</book>
<book date="20080125" price="2520">PHPライブラリコレクション</book>
</books>
*/
?>
SimpleXMLElement::addChild 
XMLノードに子要素を追加する
unknown
XMLノードに子要素を追加し、子要素のSimpleXMLElementを返します。
<?
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books title="PHP関連書籍">
<book date="20080526" price="3570">初めてのPHP & MySQL 第2版</book>
</books>
*/
# XMLファイルを読み込む
$xml=simplexml_load_file("/content/demo/book.xml");
# 最初のitem要素の属性を削除
$book=$xml->addChild("book","PHPライブラリコレクション");
$book->addAttribute("date",20080125);
$book->addAttribute("price",2520);
# XMLファイルに書き込む
echo $xml->asXML("/content/demo/book.xml");
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books title="PHP関連書籍">
<book date="20080526" price="3570">初めてのPHP & MySQL 第2版</book>
<book date="20080125" price="2520">PHPライブラリコレクション</book>
</books>
*/
?>
SimpleXMLElement::asXML 
SimpleXML要素に基づいて整形式のXML文字列を返す
unknown
親オブジェクトのデータをXML version1.0形式にフォーマットした文字列を返します。 エラーが発生した場合はFALSEを返します。
オプションの第1引数ファイル名を指定した場合は、そのファイルにデータを書き込みます。 ファイルに正常に書き込むことができた場合はTRUE、そうでない場合はFALSEを返します。
<?
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books>
<book date="20081031" price="1995">まるごとPHP! Vol.2</book>
</books>
*/
# XMLファイルを読み込む
$xml=simplexml_load_file("/content/demo/book.xml");
# XMLノードに子要素を追加する
$book=$xml->addChild("book","PHPライブラリコレクション");
$book->addAttribute("date",20080125);
$book->addAttribute("price",2520);
# XMLファイルに書き込む
$xml->asXML("/content/demo/book.xml");
# XML version1.0形式にフォーマットした文字列を表示
echo $xml->asXML();
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books>
<book date="20081031" price="1995">まるごとPHP! Vol.2</book>
<book date="20080125" price="2520">PHPライブラリコレクション</book>
</books>
*/
?>
SimpleXMLElement::attributes 
要素の属性を定義する
unknown
XML要素内で定義された属性とその値を取得して返します。
<?
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books title="PHP関連のおすすめ書籍">
<book date="20081031" price="1995">まるごとPHP! Vol.2</book>
<book date="20080918" price="2940">PHP×携帯サイト デベロッパーズバイブル</book>
<book date="20080618" price="2604" >CakePHP ポケットリファレンス</book>
<book date="20080526" price="3570">初めてのPHP & MySQL 第2版</book>
<book date="20080125" price="2520">PHPライブラリコレクション</book>
</books>
*/
# XMLファイルを読み込む
$xml=simplexml_load_file("/content/demo/book.xml");
# XML要素内で定義された属性とその値を取得する
for($i=0; $i<count($xml->book); $i++){
echo $xml->book[$i]."/";
foreach($xml->book[$i]->attributes() as $a=>$b){
echo $a.":".$b."/";
}
echo "\n";
}
/*
まるごとPHP! Vol.2/date:20081031/price:1995/
PHP×携帯サイト デベロッパーズバイブル/date:20080918/price:2940/
CakePHP ポケットリファレンス/date:20080618/price:2604/
初めてのPHP & MySQL 第2版/date:20080526/price:3570/
PHPライブラリコレクション/date:20080125/price:2520/
*/
?>
SimpleXMLElement::children 
指定したノードの子ノードを見つける
unknown
指定した要素のメンバーである子を見つけます。 結果は、通常の反復子により取得することができます。
<?
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books title="PHP関連のおすすめ書籍">
<book date="20081031" price="1995">まるごとPHP! Vol.2</book>
<book date="20080918" price="2940">PHP×携帯サイト デベロッパーズバイブル</book>
<book date="20080618" price="2604" >CakePHP ポケットリファレンス</book>
<book date="20080526" price="3570">初めてのPHP & MySQL 第2版</book>
<book date="20080125" price="2520">PHPライブラリコレクション</book>
</books>
*/
# XMLファイルを読み込む
$xml=simplexml_load_file("/content/demo/book.xml");
# 擬似配列を走査する
foreach($xml->children() as $name => $node){
echo $name."=".$node."<br/>";
}
/*
book=まるごとPHP! Vol.2
book=PHP×携帯サイト デベロッパーズバイブル
book=CakePHP ポケットリファレンス
book=初めてのPHP & MySQL 第2版
book=PHPライブラリコレクション
*/
?>
SimpleXMLElement::__construct 
新しいSimpleXMLElementオブジェクトを生成する
unknown
データを表す、新しいSimpleXMLElementオブジェクトを生成して返します。 XMLデータないでエラーが見つかるたびにE_WARNINGエラーメッセージを出し、例外をスローします。
第1引数データには、整形式XML文字列を指定します。 オプションの第3引数データがURLかの有無にTRUEを指定した場合は、XMLファイルへのパスあるいはURLを指定します。
オプション第2引数オプションは、追加のLibxmlパラメータを指定するのに使用します。
<?
# 新しいSimpleXMLElementオブジェクトを生成する
$xml=new SimpleXMLElement("/content/demo/book.xml", null, true);
echo $xml->asXML();
/*
<?xml version="1.0" encoding="utf-8"?>
<books title="PHP関連のおすすめ書籍">
<book date="20081031" price="1995">まるごとPHP! Vol.2</book>
<book date="20080918" price="2940">PHP×携帯サイト デベロッパーズバイブル</book>
<book date="20080618" price="2604">CakePHP ポケットリファレンス</book>
<book date="20080526" price="3570">初めてのPHP & MySQL 第2版</book>
<book date="20080125" price="2520">PHPライブラリコレクション</book>
</books>
*/
?>
SimpleXMLElement::getDocNamespaces 
ドキュメントで宣言されている名前空間を返す
unknown
ドキュメントで宣言されている名前空間の名前および関連付けられたURIを配列で返します。
オプションの第1引数recursiveを指定した場合は、親ノードおよび子ノードで宣言されているすべての名前空間を返します。 省略した場合は、ルートノードで宣言されている名前空間のみを返します。
<?
###### ドキュメントの名前空間の取得
$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns">
<p:person id="1">John Doe</p:person>
<p:person id="2">Susie Q. Public</p:person>
</people>
XML;
$sxe = new SimpleXMLElement($xml);
$namespaces = $sxe->getDocNamespaces();
var_dump($namespaces);
/*
array(1) {
["p"]=>
string(21) "http://example.org/ns"
}
*/
###### 複数の名前空間の使用
$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
<p:person t:id="1">John Doe</p:person>
<p:person t:id="2" a:addr="123 Street" xmlns:a="http://example.org/addr">
Susie Q. Public
</p:person>
</people>
XML;
$sxe = new SimpleXMLElement($xml);
$namespaces = $sxe->getDocNamespaces(TRUE);
var_dump($namespaces);
/*
array(3) {
["p"]=>
string(21) "http://example.org/ns"
["t"]=>
string(23) "http://example.org/test"
["a"]=>
string(23) "http://example.org/addr"
}
*/
?>
SimpleXMLElement::getName 
XML要素の名前を取得する
unknown
SimpleXMLElementオブジェクトが参照しているXML要素名を文字列で返します。
<?
/* ▼book.xml
<?xml version="1.0" encoding="utf-8"?>
<books title="PHP関連のおすすめ書籍">
<book date="20081031" price="1995">まるごとPHP! Vol.2</book>
<book date="20080918" price="2940">PHP×携帯サイト デベロッパーズバイブル</book>
<book date="20080618" price="2604" >CakePHP ポケットリファレンス</book>
<book date="20080526" price="3570">初めてのPHP & MySQL 第2版</book>
<book date="20080125" price="2520">PHPライブラリコレクション</book>
</books>
*/
# XMLファイルを読み込む
$xml=new SimpleXMLElement("/content/demo/book.xml", null, true);
# 要素名を取得する
echo $xml->getName()."\n"; // books
foreach($xml->children() as $child){
# 要素名を取得する
echo $child->getName()."\n";
}
/*
book
book
book
book
book
*/
?>
SimpleXMLElement::getNamespaces 
ドキュメントで使用している名前空間を返す
unknown
ドキュメントで使用している名前空間の名前および関連付けられたURIを配列で返します。
オプションの第1引数recursiveを指定した場合は、親ノードおよび子ノードで宣言されているすべての名前空間を返します。 省略した場合は、ルートノードで宣言されている名前空間のみを返します。
<?
$xml = <<<XML
<?xml version="1.0" standalone="yes"?>
<people xmlns:p="http://example.org/ns" xmlns:t="http://example.org/test">
<p:person id="1">John Doe</p:person>
<p:person id="2">Susie Q. Public</p:person>
</people>
XML;
$sxe = new SimpleXMLElement($xml);
$namespaces = $sxe->getNamespaces(true);
var_dump($namespaces);
/*
array(1) {
["p"]=>
string(21) "http://example.org/ns"
}
*/
?>
SimpleXMLElement::registerXPathNamespace 
次のXPathクエリ用のprefix/nsコンテキストを作成する
unknown
次のXPathクエリ用のprefix/nsコンテキストを作成します。 成功した場合にTRUE、失敗した場合にFALSEを返します。
registerXPathNamespaceは、XMLドキュメントの提供者が名前空間のプレフィックスを変更した場合に有用です。 プレフィックスを作成して名前空間に関連付け、そのプレフィックスで名前空間のノードにアクセス可能にするため、提供者がプレフィックスを変更しても、コードを書き換える必要がありません。
第1引数prefixには、nsで指定した名前空間へのXPathクエリで使用する名前空間プレフィックスを指定します。
第2引数nsには、XPathクエリで使用する名前空間を指定します。 指定する名前空間は、XMLドキュメントで使用している名前空間と一致している必要があります。 一致していない場合は、prefixを使用したXPathクエリは何も結果を返しません。
<?
# XPathクエリで使用する名前空間プレフィックスの設定
$xml = <<<EOD
<book xmlns:chap="http://example.org/chapter-title">
<title>My Book</title>
<chapter id="1">
<chap:title>Chapter 1</chap:title>
<para>Donec velit. Nullam eget tellus vitae tortor gravida scelerisque.
In orci lorem, cursus imperdiet, ultricies non, hendrerit et, orci.
Nulla facilisi. Nullam velit nisl, laoreet id, condimentum ut,
ultricies id, mauris.</para>
</chapter>
<chapter id="2">
<chap:title>Chapter 2</chap:title>
<para>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin
gravida. Phasellus tincidunt massa vel urna. Proin adipiscing quam
vitae odio. Sed dictum. Ut tincidunt lorem ac lorem. Duis eros
tellus, pharetra id, faucibus eu, dapibus dictum, odio.</para>
</chapter>
</book>
EOD;
$sxe=new SimpleXMLElement($xml);
$sxe->registerXPathNamespace('c', 'http://example.org/chapter-title');
$result = $sxe->xpath('//c:title');
foreach($result as $title){
echo $title."\n";
}
/*
Chapter 1
Chapter 2
*/
?>
SimpleXMLElement::xpath 
XMLデータにXpathクエリを実行する
unknown
指定したpathに指定したXPatにマッチするSimpleXMLノードを探し、SimpleXMLElementオブジェクトの配列を返します。 エラーが発生した場合はFALSEを返します。
<?
###### Xpath
$string = <<<XML
<a>
<b>
<c>text</c>
<c>stuff</c>
</b>
<d>
<c>code</c>
</d>
</a>
XML;
$xml=new SimpleXMLElement($string);
# <a><b><c> を探す
$result=$xml->xpath('/a/b/c');
while(list( , $node)=each($result)) {
echo '/a/b/c: ',$node,"\n";
}
/*
/a/b/c: text
/a/b/c: stuff
*/
# 相対パスでも動作
$result=$xml->xpath('b/c');
while(list( , $node)=each($result)) {
echo 'b/c: ',$node,"\n";
}
/*
b/c: text
b/c: stuff
*/
?>
simplexml_import_dom 
DOMノードからSimpleXMLElementオブジェクトを取得する
unknown
ノードに指定したDOMドキュメントからSimpleXMLElementオブジェクトを作成して返します。 失敗した場合はFALSEを返します。 作成したオブジェクトは、通常のSimpleXML要素として使用することができます。
第1引数ノードには、DOM要素ノードを指定します。
オプションの第2引数クラス名を指定すると、この関数は指定したクラスのオブジェクトを生成します。 このクラスは、SimpleXMLElementを継承している必要があります。
<?
# DOM のインポート
$dom=new DOMDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!$dom) {
echo 'ドキュメントのパース時にエラーが発生しました';
exit;
}
$s=simplexml_import_dom($dom);
echo $s->book[0]->title; // blah
?>
simplexml_load_file 
XMLファイルをパースしてオブジェクトに代入する
unknown
指定したファイル名のファイル中の整形式XMLドキュメントをSimpleXMLElementクラスのオブジェクトに変換して返します。 返り値のオブジェクトは、XMLドキュメント内のデータをプロパティに含みます。 エラーが発生した場合はFALSEを返します。
第1引数ファイル名には、XMLファイルへのパスを指定します。
Libxml2はURIをエスケープしません。
例えばURIパラメータaに「b&c」を渡す場合は、simplexml_load_file(rawurlencode('http://example.com?a='.urlencode('b&c')))
をコールする必要があります。
PHP v5.1.0以降ではPHPが自動的に行うのでエスケープする必要はありません。
オプション第2引数オプションは、追加のLibxmlパラメータを指定するのに使用します(PHP v5.1.0とLibxml v2.6.0~)。
<?
# XMLドキュメントをパースする
if(file_exists('/content/demo/book.xml')){
$xml=simplexml_load_file('/content/demo/book.xml');
print_r($xml);
}else{
exit('Failed to open test.xml.');
}
/*
SimpleXMLElement Object
(
[@attributes] => Array
(
[title] => PHP関連のおすすめ書籍
)
[book] => Array
(
[0] => まるごとPHP! Vol.2
[1] => PHP×携帯サイト デベロッパーズバイブル
[2] => CakePHP ポケットリファレンス
[3] => 初めてのPHP & MySQL 第2版
[4] => PHPライブラリコレクション
)
)
*/
?>
simplexml_load_string 
XML文字列をオブジェクトに代入する
unknown
データに指定した整形式XML文字列をSimpleXMLElementクラスのオブジェクトにして返します。 返り値のオブジェクトは、XMLドキュメント内のデータをプロパティに含みます。 エラーが発生した場合はFALSEを返します。
第1引数データには、整形式XML文字列を指定します。
オプション第2引数クラス名を使用すると、simplexml_load_file()が指定されたクラスのオブジェクトを返すようにすることができます。 このクラスは、SimpleXMLElementを継承している必要があります。
オプション第3引数オプションは、追加のLibxmlパラメータを指定するのに使用します(PHP v5.1.0とLibxml v2.6.0~)。
<?
# XML 文字列をパースする
$string = <<<XML
<?xml version='1.0'?>
<document>
<title>Forty What?</title>
<from>Joe</from>
<to>Jane</to>
<body>
I know that's the answer -- but what's the question?
</body>
</document>
XML;
$xml=simplexml_load_string($string);
var_dump($xml);
/*
object(SimpleXMLElement)#1 (4) {
["title"]=>
string(11) "Forty What?"
["from"]=>
string(3) "Joe"
["to"]=>
string(4) "Jane"
["body"]=>
string(57) "
I know that's the answer -- but what's the question?
"
}
*/
echo $xml->body; // I know that's the answer -- but what's the question?
?>