PHPプログラムに関する各種メモ書き:タグ「XML」での検索

PHP 5.4のE_STRICTエラーに対応する

PHP 5.4からは 5.3までは出力されなかった【E_STRICTエラー】がデフォルトで出力されるようになっています。 なのでPHPのバージョンを 5.3以下から5.4以上に上げるとE_STRICTエラーが表示されることがよくあります。

1. PHP 5.4のE_STRICTエラーの対処法(ソースを修正する)

自分で書いたソースの場合はエラーの内容を調べて修正するのが一番よいでしょう。
http://goo.gl/moKrOg

2. PHP 5.4のE_STRICTエラーの対処法(エラーを表示しないようにする)

そもそも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);
No.966
07/30 22:40

edit

PEAR
XML
エラー対処

PHPでXMLのXSLT変換を行う。

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);
?>

XSLT書式

http://vosegus.org/guideline/xslt.html

例:そのノードのテキストが hoge の場合のみ ZZZZZZZZZ を表示する

<xsl:if test="contains(./text() , 'hoge')">
ZZZZZZZZZ
</xsl:if>

襟:デフォルト値をセットする

<xsl:param name="contents">デフォルト値</xsl:param>
No.741
04/08 10:00

edit

Xpath
XML

PHPでXMLパースしてオブジェクトまたはハッシュに変換する

● 1. PHPでXMLをパースしてハッシュ(配列)に変換する

こちらの関数を使用すると簡単に取得できます。
が、次の <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
                                )
                        )
                )
        )
)

● 2. PHPでXMLをパースしてハッシュ(配列)に変換する

完璧に取得したい場合はこちらがおすすめです。

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

● 3. PHPでXMLをパースしてオブジェクトまたはハッシュに変換する

よくネットで見かけるやり方です。通常これでも問題ないのですが、 <ns2:ItemDimensions> のようなネーム空間を持つXMLを変換できない時があります。

$xml = simplexml_load_string($html);
$xml_array = json_decode( json_encode( $xml ), TRUE );

● Message: simplexml_load_string(): Entity: line 1: parser error : Unsupported encoding x-sjis-cp932 エラーとなる場合の対処

返される xml が x-sjis-cp932 エンコーディングの場合エラーとなるので、次のように変換する。

 $data = mb_convert_encoding($data,"UTF-8");
 $data = str_replace("x-sjis-cp932","UTF-8",$data);
No.422
02/01 17:07

edit

PEAR
XML

RSSフィード(XML)をパースしてPHPオブジェクトに変換する【PEAR::XML_Serializer】

RSSフィード(XML)をパースしてPHPオブジェクト(や配列)に変換するには下記の2通りの方法があります

■1. PEAR::XML_Serializerを使用する方法

xml 文章を配列やオブジェクトにしてくれる PEAR::XML_Serializer

http://pear.php.net/package/XML_Serializer/download

からダウンロード

PEARでのインストール方法

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 で行えます。

■2. SimpleXMLElement (要PHP5以降)を使用する方法

使い方

$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);

どちらも簡単ですね!

添付ファイル1
phplib.zip ( 37.3 KBytes ) ダウンロード
No.258
03/18 09:59

edit

添付ファイル

XML
PEAR