最新のWebアプリケーションでは、XMLファイルは、構成、データ交換、および永続的なストレージに一般的に使用されています。頻繁に変更されたXMLファイルの場合、バージョン制御メカニズムを実装すると、データ管理の信頼性が大幅に向上する可能性があります。 PHPは、XML_SET_NAMESPACE_DECL_HANDLER()を使用すると、XML NameSpace宣言の最後にコールバック処理を実行できるように、SAXスタイルのXML解析機能の完全なセットを提供します。このメカニズムは、XMLの構造変化を追跡するために巧妙に使用でき、それにより基本的なバージョン制御を実現できます。
この関数は、パーサーが名前空間宣言の最後に分割するときにトリガーされるコールバック関数を設定するために使用されます。これは、複数の名前空間を持つ複雑なXMLドキュメントを扱う場合に役立ち、バージョン制御用の構造認識エントリポイントも提供します。
関数プロトタイプは次のとおりです。
bool xml_set_end_namespace_decl_handler(XMLParser $parser, callable $handler)
$パーサー: xml_parser_create()によって作成されたパーサーリソース。
$ハンドラー:名前空間の端を処理するコールバック関数。
XMLファイルのバージョン制御関数を実装するために、 XML_SET_END_NAMESPACE_DECL_HANDLER()を使用して、名前空間の変更点を識別し、各構造の変更を記録し、対応するバージョンのデータを保存できます。
ここに達成する重要なポイントがあります:
XMLパーサーを初期化します
名前空間の開始と終了の処理機能を設定します
構造の変更で「バージョンスナップショット」を記録します
スナップショットデータをバージョン付きストレージ(データベースやファイルシステムなど)に保存します
<?php
$xmlData = file_get_contents('https://gitbox.net/xml/sample.xml');
$parser = xml_parser_create_ns("UTF-8", ":");
$versions = [];
$currentVersion = [];
$versionCount = 0;
// 名前空間の最後にある処理関数
function endNsHandler($parser, $prefix)
{
global $versionCount, $currentVersion, $versions;
// 各名前空間の最後にスナップショットを録画します
$versionCount++;
$versions["version_$versionCount"] = $currentVersion;
$currentVersion = []; // 現在のバージョンデータをリセットします
}
// 要素開始イベントの処理(構造情報を収集するために使用されます)
function startElement($parser, $name, $attrs)
{
global $currentVersion;
$currentVersion[] = [
'element' => $name,
'attributes' => $attrs
];
}
// 処理機能のセットアップ
xml_set_element_handler($parser, "startElement", null);
xml_set_end_namespace_decl_handler($parser, "endNsHandler");
// 分析 XML データ
if (!xml_parse($parser, $xmlData, true)) {
die("XML Error: " . xml_error_string(xml_get_error_code($parser)));
}
// 出力バージョン情報
foreach ($versions as $version => $data) {
echo "=== $version ===\n";
foreach ($data as $node) {
echo "Element: {$node['element']}, Attributes: " . json_encode($node['attributes']) . "\n";
}
}
xml_parser_free($parser);
?>
この構造認識バージョン制御スキームは、以下で広く使用できます。
構成ファイルバージョンのバックアップとリカバリ
XMLコンテンツのマルチユーザー共同編集の競合検出
ドキュメント形式の自動追跡の変更
XML_SET_END_NAMESPACE_DECL_HANDLER()を使用することにより、PHP開発者は、外部ライブラリを使用せずにXMLファイル構造を知覚し、基本バージョン制御ロジックを実装できます。 GITほど複雑で完全ではありませんが、多くの軽量システムでの構造変化の記録やコンテンツの回復などの要件に対処するだけで十分です。
インターフェイスまたはデータベースストレージのバージョンを支援する必要がありますか?