PHP 5.4からは 5.3までは出力されなかった【E_STRICTエラー】がデフォルトで出力されるようになっています。 なのでPHPのバージョンを 5.3以下から5.4以上に上げるとE_STRICTエラーが表示されることがよくあります。
自分で書いたソースの場合はエラーの内容を調べて修正するのが一番よいでしょう。
http://goo.gl/moKrOg
そもそもPHPのバージョンが5.3以下の場合は出力されてなかったエラーなので、そもそもエラーを表示させないという手法。 古いPEARパッケージにはこのエラーが含まれていることが多いので以下のようにエラーが出る箇所を【エラー設定】【エラー戻し】で囲むといいでしょう。
// 【エラー設定】E_STRICT , E_DEPRECATED を非表示
$old_error = error_reporting( E_ALL & ~E_STRICT & ~E_DEPRECATED);
// PEARパッケージの処理(例)
require_once 'XML/Unserializer.php'; // 例:PEARの XML::Unserializer は確実にE_STRICTエラーが出ます。
// 何かしらの処理
// 【エラー戻し】
error_reporting($old_error);
XMLファイルからHTMLファイルを作成したい時、XSLTを使うと早い場合があります。
そのサンプル
<?php $xml = new DomDocument(); $xml->load('test.xml'); $xsl = new DomDocument(); $xsl->load('sample01.xsl'); $processor = new xsltprocessor(); $processor->importStyleSheet($xsl); echo $processor->transformToXML($xml); ?>
http://vosegus.org/guideline/xslt.html
<xsl:if test="contains(./text() , 'hoge')"> ZZZZZZZZZ </xsl:if>
<xsl:param name="contents">デフォルト値</xsl:param>
こちらの関数を使用すると簡単に取得できます。
が、次の <dddd>タグのような attributes が取得できません。( Id="id:pass" が無視される)
<eeee>タグ内の attributes は取得できます。
$xml = <<< DOC_END
<aaaa Version="1.0">
<bbb>
<cccc>
<dddd Id="id:pass">テスト</dddd>
<eeee name="hearaman" age="24" />
</cccc>
</bbb>
</aaaa>
DOC_END;
function xml2array($xml){
$xml = preg_replace('/(<\/?)\w+:([^>]*>)/', '$1$2', $xml); //get rid of namespaces
$xml = simplexml_load_string($xml);
return json_decode(json_encode($xml),true); //use built-in stuff
}
結果
Array
(
[@attributes] => Array
(
[Version] => 1.0
)
[bbb] => Array
(
[cccc] => Array
(
[dddd] => テスト
[eeee] => Array
(
[@attributes] => Array
(
[name] => hearaman
[age] => 24
)
)
)
)
)
完璧に取得したい場合はこちらがおすすめです。
function XMLtoArray($xml) {
$previous_value = libxml_use_internal_errors(true);
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->preserveWhiteSpace = false;
$dom->loadXml($xml);
libxml_use_internal_errors($previous_value);
if (libxml_get_errors()) {
return [];
}
return DOMtoArray($dom);
}
function DOMtoArray($root) {
$result = array();
if ($root->hasAttributes()) {
$attrs = $root->attributes;
foreach ($attrs as $attr) {
$result['@attributes'][$attr->name] = $attr->value;
}
}
if ($root->hasChildNodes()) {
$children = $root->childNodes;
if ($children->length == 1) {
$child = $children->item(0);
if (in_array($child->nodeType,[XML_TEXT_NODE,XML_CDATA_SECTION_NODE])) {
$result['_value'] = $child->nodeValue;
return count($result) == 1
? $result['_value']
: $result;
}
}
$groups = array();
foreach ($children as $child) {
if (!isset($result[$child->nodeName])) {
$result[$child->nodeName] = DOMtoArray($child);
} else {
if (!isset($groups[$child->nodeName])) {
$result[$child->nodeName] = array($result[$child->nodeName]);
$groups[$child->nodeName] = 1;
}
$result[$child->nodeName][] = DOMtoArray($child);
}
}
}
return $result;
}
結果
Array
(
[aaaa] => Array
(
[@attributes] => Array
(
[Version] => 1.0
)
[bbb] => Array
(
[cccc] => Array
(
[dddd] => Array
(
[@attributes] => Array
(
[Id] => id:pass
)
[_value] => テスト
)
[eeee] => Array
(
[@attributes] => Array
(
[name] => hearaman
[age] => 24
)
)
)
)
)
)
引用元 : https://goo.gl/Ko7fwC
名前空間の名前が付いてくるのが邪魔な場合は変換前に次の1行を噛ませて名前空間を削除しておきましょう。
$xml = preg_replace('/(<\/?)\w+:([^>]*>)/', '$1$2', $xml); //get rid of namespaces
よくネットで見かけるやり方です。通常これでも問題ないのですが、 <ns2:ItemDimensions> のようなネーム空間を持つXMLを変換できない時があります。
$xml = simplexml_load_string($html);
$xml_array = json_decode( json_encode( $xml ), TRUE );
返される xml が x-sjis-cp932 エンコーディングの場合エラーとなるので、次のように変換する。
$data = mb_convert_encoding($data,"UTF-8");
$data = str_replace("x-sjis-cp932","UTF-8",$data);
RSSフィード(XML)をパースしてPHPオブジェクト(や配列)に変換するには下記の2通りの方法があります
xml 文章を配列やオブジェクトにしてくれる PEAR::XML_Serializer
http://pear.php.net/package/XML_Serializer/download
からダウンロード
pear install XML_Util pear install XML_Serializer-0.18.0
でOK!
<b>またはこのファイルをダウンロード(phplib.zip)してサーバーにアップロードします。</b>
$url = "http://sankei.jp.msn.com/rss/news/points.xml"; // RSSフィードのURL $xml = file_get_contents($url); require_once "XML/Unserializer.php"; $parser = new XML_Unserializer(array('parseAttributes' => true)); $parser->unserialize($xml); $data = $parser->getUnserializedData(); if (PEAR::isError($data)) { print ('ERROR'); } print_r($data);
エラー補足は PEAR::isError で行えます。
$url = "http://sankei.jp.msn.com/rss/news/points.xml"; // RSSフィードのURL $xml = file_get_contents($url); $xml = preg_replace( '/dc:/', 'dc_', $xml ); // <dc:subject> <dc:date> などを取得する場合は : を _ に置換する。 $data_obj = new SimpleXMLElement($xml); $data = (ARRAY)$data_obj; print_r($data);
どちらも簡単ですね!