ホームページ >バックエンド開発 >PHPの問題 >PHPでXMLを配列に変換する方法

PHPでXMLを配列に変換する方法

PHPz
PHPzオリジナル
2023-04-26 18:00:06722ブラウズ

Web アプリケーションを開発する場合、多くの場合、外部ソースから XML データを取得して処理する必要があります。多くの場合、データの追加、変更、削除、アクセスを容易にするために、これらの XML データを PHP 配列に変換する必要があります。

PHP では、SimpleXML 関数ライブラリを使用して XML ファイルを解析および操作できます。また、DOM 関数ライブラリを使用して同じタスクを実行することもできます。ただし、この記事では、SimpleXML ライブラリを使用して XML ファイルを PHP 配列に変換する方法に焦点を当てます。

  1. XML ファイルのロード

XML ファイルを PHP 配列に変換する前に、まず XML ファイルをロードする必要があります。これは、次のように SimpleXMLElement クラスのコンストラクターを通じて実行できます。

$xml = new SimpleXMLElement('filename.xml', null, true);

ここで、最初のパラメーターは XML ファイルへのパス、2 番目のパラメーターは XML ファイルのオプションを指定し、3 番目のパラメーターは次のことを示します。名前空間のサポートを有効にするかどうか。

  1. XML から配列への変換

XML ファイルをロードしたら、SimpleXML ライブラリが提供するメソッドを使用して、それを PHP 配列に変換できます。まず、XML データを保持する空の配列を作成する必要があります。次に、以下に示すように、SimpleXMLElement クラスの Children() メソッドを使用して、現在のノードのすべての子ノードを取得できます。

$array = array();
foreach ($xml->children() as $element) {
    $name = $element->getName();
    $attributes = $element->attributes();
    if (!$attributes) {
        if (!isset($array[$name])) {
            $array[$name] = (string) $element;
        } else {
            if (!is_array($array[$name])) {
                $array[$name] = array($array[$name]);
            }
            $array[$name][] = (string) $element;
        }
    } else {
        $array[$name][] = array();
        foreach ($attributes as $attrName => $attrValue) {
            $array[$name][count($array[$name])-1]['_'.$attrName] = (string) $attrValue;
        }
        if ($element->children()) {
            $array[$name][count($array[$name])-1] = array_merge($array[$name][count($array[$name])-1],$this->xml2array($element));
        } else {
            $array[$name][count($array[$name])-1]['value'] = (string) $element;
        }
    }
}

ここでは、foreach ループを使用してすべての子ノードを走査し、各子ノードの名前と値を取得します。子ノードのないノードの場合は、その内容を配列の値として保存し、その名前がノード名になります。子ノードのあるノードの場合は、xml2array() 関数が再帰的に呼び出され、その子ノードが配列に変換されます。これらの配列は現在のノードの配列にマージされます。

  1. 配列の整理

XML データを PHP 配列に変換した後、ニーズをより適切に満たすために、出力配列をさらに処理する必要がある場合があります。たとえば、すべてのプロパティを個別の配列に保存したり、アプリケーションのニーズに合わせて配列構造を変更したりする必要がある場合があります。以下に、実行する必要がある一般的な整理操作をいくつか示します。

  • すべてのプロパティを個別の配列に保存します。
function xml2array($xml) {
    $array = array();
    foreach ($xml->children() as $element) {
        $name = $element->getName();
        $attributes = $element->attributes();
        if (!$attributes) {
            if (!isset($array[$name])) {
                $array[$name] = (string) $element;
            } else {
                if (!is_array($array[$name])) {
                    $array[$name] = array($array[$name]);
                }
                $array[$name][] = (string) $element;
            }
        } else {
            $array[$name][] = array('_attributes' => array());
            foreach ($attributes as $attrName => $attrValue) {
                $array[$name][count($array[$name])-1]['_attributes'][$attrName] = (string) $attrValue;
            }
            if ($element->children()) {
                $array[$name][count($array[$name])-1] = array_merge($array[$name][count($array[$name])-1],$this->xml2array($element));
            } else {
                $array[$name][count($array[$name])-1]['value'] = (string) $element;
            }
        }
    }
    return $array;
}
  • 配列構造をより適切なものに変更します。アプリケーションのニーズ:
function xml2array($xml) {
    $array = array();
    foreach ($xml->children() as $element) {
        $name = $element->getName();
        $attributes = $element->attributes();
        if (!$attributes) {
            if (!isset($array[$name])) {
                $array[$name] = (string) $element;
            } else {
                if (!is_array($array[$name])) {
                    $array[$name] = array($array[$name]);
                }
                $array[$name][] = (string) $element;
            }
        } else {
            $node = array(
                '_name' => $name,
                '_value' => (count($element->children()) == 0) ? (string) $element : null,
                '_attributes' => array(),
                '_children' => array()
            );
            foreach ($attributes as $attrName => $attrValue) {
                $node['_attributes'][$attrName] = (string) $attrValue;
            }
            foreach ($element->children() as $childElement) {
                $childNode = $this->xml2array($childElement);
                $childName = $childElement->getName();
                if (count($childNode) == 1) {
                    $node['_children'][$childName] = reset($childNode);
                } else {
                    $node['_children'][$childName][] = $childNode;
                }
            }
            if (!isset($array[$name])) {
                $array[$name] = $node;
            } else {
                if (!is_array($array[$name])) {
                    $array[$name] = array($array[$name]);
                }
                $array[$name][] = $node;
            }
        }
    }
    return $array;
}

ここでは、ノードを処理するときに、名前、値、属性、子ノードの 4 つの要素を含む新しい配列を作成します。これにより、出力配列をデータベース テーブル、クラス属性、またはその他のデータ構造に簡単にマッピングできるようになります。

概要

PHP で XML ファイルを PHP 配列に変換するには、SimpleXML 関数ライブラリを使用します。 SimpleXMLElement クラスの Children() メソッドを使用すると、XML ツリーをトラバースし、PHP 配列を使用してデータを保存できます。 PHP 配列に変換されると、データはさらに処理されて、アクセスや操作が容易になります。

以上がこの記事で紹介する内容ですが、Web開発においてPHPを使ってXMLファイルを処理する際の参考になれば幸いです。

以上がPHPでXMLを配列に変換する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。