現在の位置: ホーム> 最新記事一覧> xml_set_element_handlerで使用されるxml_parseの例

xml_set_element_handlerで使用されるxml_parseの例

M66 2025-05-13

Web開発を行うときは、サードパーティAPIから取得したデータ応答など、XMLデータを処理するか、特定の構成ファイルを解析する必要があることがよくあります。 PHPでは、 XML_PARSEおよびXML_SET_ELEMENT_HANDLERは、特に大きなファイルの処理やストリーミング解析に適したイベント駆動型のXMLデータを処理する方法を提供します。

この記事では、実用的なケースを使用して、これら2つの機能を使用してXMLコンテンツを解析し、必要なデータを抽出する方法を示します。

1。基本概念の紹介

simplexmldomdocumentxmlreaderなどを使用するなど、phpでxmlを処理する方法はたくさんありますが、 xml_parseはイベントベースの解析方法であり、sax(xml for xml for xmlの単純API)パーサーとも呼ばれます。この解析方法は、XML全体をメモリにロードする必要がないため、大量のXMLを処理するのに最適です。

コア関数:

2。実際のケース:記事情報の分析

コンテンツプラットフォームからのXMLデータのような部分があると仮定しましょう。

 <?xml version="1.0"?>
<articles>
    <article>
        <title>PHP XML分析ガイド</title>
        <author>リー・レイ</author>
        <url>https://m66.net/articles/php-xml-guide</url>
    </article>
    <article>
        <title>詳細な理解 xml_set_element_handler</title>
        <author>ハン・メイミー</author>
        <url>https://m66.net/articles/xml-handler-deepdive</url>
    </article>
</articles>

目標:すべての記事のタイトルとリンクを抽出し、配列に保存します。

3。コード実装

<?php

$xmlData = <<<XML
<?xml version="1.0"?>
<articles>
    <article>
        <title>PHP XML分析ガイド</title>
        <author>リー・レイ</author>
        <url>https://m66.net/articles/php-xml-guide</url>
    </article>
    <article>
        <title>詳細な理解 xml_set_element_handler</title>
        <author>ハン・メイミー</author>
        <url>https://m66.net/articles/xml-handler-deepdive</url>
    </article>
</articles>
XML;

$parser = xml_parser_create("UTF-8");

$articles = [];
$currentTag = "";
$currentArticle = [];

// Startタグプロセッサを定義します
function startElement($parser, $name, $attrs) {
    global $currentTag;
    $currentTag = strtolower($name);
}

// エンドタグプロセッサを定義します
function endElement($parser, $name) {
    global $currentTag, $currentArticle, $articles;
    
    if (strtolower($name) == 'article') {
        $articles[] = $currentArticle;
        $currentArticle = [];
    }
    $currentTag = "";
}

// 文字データプロセッサを定義します
function characterData($parser, $data) {
    global $currentTag, $currentArticle;

    $data = trim($data);
    if ($data === '') return;

    if (in_array($currentTag, ['title', 'author', 'url'])) {
        $currentArticle[$currentTag] = $data;
    }
}

// 処理機能のセットアップ
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");

// 解析を開始します
if (!xml_parse($parser, $xmlData, true)) {
    die(sprintf("XML 間違い: %s で %d わかりました",
        xml_error_string(xml_get_error_code($parser)),
        xml_get_current_line_number($parser)));
}

xml_parser_free($parser);

// 出力分析の結果
echo "<pre>";
print_r($articles);
echo "</pre>";
?>

4。出力結果

Array
(
    [0] => Array
        (
            [title] => PHP XML分析ガイド
            [author] => リー・レイ
            [url] => https://m66.net/articles/php-xml-guide
        )

    [1] => Array
        (
            [title] => 詳細な理解 xml_set_element_handler
            [author] => ハン・メイミー
            [url] => https://m66.net/articles/xml-handler-deepdive
        )
)

5。概要

このケースを通じて、 XML_PARSEXML_SET_ELEMENT_HANDLERが必要に応じてすべてのタグとテキストコンテンツを処理できることがわかります。この方法はSimplexMLよりもわずかに複雑ですが、XMLファイルが非常に大きいか、ネットワークストリームから来ている場合、その利点が現れます。

次のシナリオに適用できます。

  • 大規模XMLファイルのメモリに敏感な処理。

  • ネットワークストリームのXMLデータをリアルタイムで解析します。

  • XMLタグのカスタムファインコントロールが必要なシナリオ。

複雑なXML構造に対処する必要があるシステムを構築している場合は、このサックス解析方法を試すことをお勧めします。