XMLからJSONデータ変換プロジェクト

目次

プロジェクト概要

前提条件

  • Pythonプログラミングの基本的な知識(変数、関数、クラスの概念)
  • VSCodeエディタの基本操作ができること
  • ターミナル(コマンドライン)の基本的な使用経験
  • Gitとバージョン管理の基礎知識
  • ファイルとフォルダの基本的な操作方法の理解

開発環境

  • Python 3.7以上
  • VSCode(Visual Studio Code)
  • Git(バージョン管理システム)
  • GitHubアカウント
  • xmltodict
  • json(Python標準ライブラリ)
  • os(Python標準ライブラリ)

プロジェクト内容

このプロジェクトでは、XMLファイルをJSON形式に変換するデータ変換システムを構築します。初心者でも段階的に学習できるよう、基本的な環境設定からファイル操作、データ変換まで、4つのステップに分けて実装していきます。

プロジェクトの核となるのは、xmltodictライブラリを使用したXMLデータの辞書変換技術です。XMLファイルを読み込み、Pythonで扱いやすい辞書形式に変換した後、JSON形式で出力する一連の処理を自動化します。これにより、異なるデータ形式間での変換技術を習得できます。

データ処理においては、ファイルの存在確認、読み込み、書き込みという基本的なファイル操作を重視しています。os.path.isfile()によるファイル確認、with文を使用した安全なファイル操作、エンコーディングを指定した日本語対応など、実際の業務で必要となる技術を網羅しています。

プロジェクトの特徴として、エラーハンドリングを重視した安定性の高いシステム設計を採用しています。ファイルが存在しない場合や変換処理でエラーが発生した場合でも、適切なエラーメッセージを表示し、プログラムが安全に終了するよう設計されています。

また、フォルダの自動作成機能も実装し、出力先が存在しない場合でも自動的に作成する利便性の高いシステムを構築します。これにより、ユーザーが事前にフォルダを準備する必要がない、使いやすいツールとして完成させます。

開発プロセスでは、オブジェクト指向プログラミングの概念を活用し、DataConverterクラスを中心とした構造化されたコード設計を採用します。各機能を独立したメソッドとして実装することで、コードの可読性と保守性を向上させます。

最終的に、完成したプロジェクトをGitHubにアップロードし、ポートフォリオとして活用できる形にします。適切な.gitignoreファイルの設定や、プロジェクト管理の基本的な流れも学習できます。

実装内容

  • 仮想環境の構築と依存関係管理(requirements.txt)
  • XMLファイルの読み込みとデータ構造の確認機能
  • xmltodictを使用したXML→辞書変換処理
  • JSON形式への変換とファイル保存機能
  • 出力フォルダの自動作成システム
  • ファイルサイズ確認と変換結果検証機能
  • エラーハンドリングと安全なファイル操作
  • GitHubでのバージョン管理とポートフォリオ公開

得られるスキル

  • xmltodictライブラリ(XMLデータの辞書変換技術)
  • JSON操作(json.dumps、json.loadによるデータ変換)
  • ファイル操作(open、read、writeによる基本的なファイル処理)
  • フォルダ操作(os.makedirs、os.path.existsによるディレクトリ管理)

得られる経験

  • 異なるデータ形式間での変換処理経験
  • ファイルとフォルダの自動化処理の習得
  • エラーハンドリングを含む安定したプログラム開発
  • 仮想環境での開発環境構築と管理

得られる成果物

  • 完全に動作するデータ変換システム
  • GitHubでのポートフォリオとして活用可能なプロジェクト
  • 完全なPythonソースコード

Step1:開発環境の準備とプロジェクト構造の作成

このステップでは、書店システム用データ変換ツールプロジェクトを始めるための開発環境を整備し、必要なファイル構造を作成していきます。プログラミングを始める前の準備段階として、とても重要な作業になります。

※Step1の内容がわからない際は、下記記事にGitHubとVSCodeの連携について詳細を記載しているためご参照ください。

GitHubリポジトリの作成

まず最初に、プロジェクト専用のGitHubリポジトリを作成しましょう。

  1. GitHubの公式サイトにアクセスし、自分のアカウントでログインします
  2. 画面右上の「+」アイコンをクリックし、ドロップダウンメニューから「New repository」を選択します
  3. 新しいリポジトリの作成ページで、以下の情報を入力します

リポジトリの設定

  • Repository namebookstore_converter」と入力
  • Description書店システム用XMLからJSONへのデータ変換ツール」と入力
  • VisibilityPublic」を選択(ポートフォリオとして公開するため)
  • Initialize this repository with
    • Add a README file」にチェックを入れる
    • Add .gitignore」で「Python」を選択
    • Choose a license」は「None」のままにする
  1. Create repository」ボタンをクリックしてリポジトリを作成します

プロジェクトフォルダの作成

次に、プロジェクトを管理するための親フォルダを作成しましょう。

Windows・macOS共通

  1. デスクトップや任意の場所に新しいフォルダを作成します
  2. フォルダ名は任意ですが、ここでは例として「PythonPortfolio」に設定します

この親フォルダが、今後のプロジェクト全体を管理するルートディレクトリとなります。複数のプロジェクトを整理して管理するために作成しておくと便利です。

VSCodeでプロジェクトを開く

作成したGitHubリポジトリをローカルにクローンして開きましょう。

  1. VSCodeを起動します
  2. 左側のアクティビティバーからソース管理アイコン(分岐のようなアイコン)をクリックします
  3. リポジトリの複製」ボタンをクリックします
  4. GitHubから複製」を選択します
  5. 先ほど作成した「bookstore_converter」リポジトリを選択します
  6. リポジトリ宛先として先ほど作成した親フォルダを選択します
  7. クローンしたリポジトリを開きますか」というウィンドウが表示されたら「開く」をクリックします

VSCodeの左側にエクスプローラーパネルが表示され、現在のプロジェクトフォルダの中身が確認できるようになります。

仮想環境の作成とアクティベート

Python開発において仮想環境は非常に重要です。仮想環境とは、プロジェクトごとに独立したPython実行環境を作成する仕組みのことです。これにより、プロジェクト間でのライブラリの競合を防ぎ、クリーンな開発環境を維持できます。

※Step1の内容がわからない際は、下記記事にGitHubとVSCodeの連携について詳細を記載しているためご参照ください。

Windows環境での仮想環境作成

  1. VSCodeの上部メニューから「ターミナル」→「新しいターミナル」を選択
  2. 以下のコマンドで仮想環境を作成します
python -m venv myenv
  1. 仮想環境をアクティベートします
myenv\Scripts\activate

macOS環境での仮想環境作成

  1. VSCodeの上部メニューから「ターミナル」→「新しいターミナル」を選択
  2. 以下のコマンドで仮想環境を作成します
python3 -m venv myenv
  1. 仮想環境をアクティベートします
source myenv/bin/activate

重要なポイント

  • 仮想環境名は「myenv」として作成
  • ターミナルの行頭に「(myenv)」と表示されることを確認
  • この表示があることで、仮想環境が正常にアクティベートされていることがわかります

プロジェクトファイル構造の作成

次に、今回の書店データ変換プロジェクトに必要なフォルダとファイルを作成していきます。VSCodeのエクスプローラーパネルを使用してファイルを作成しましょう。

ソースコード用フォルダの作成

  1. VSCodeの左側エクスプローラーパネルで「新しいフォルダ」アイコン(フォルダの絵とプラスのマークがあるアイコン)をクリック
  2. フォルダ名を「src」として作成

この「src」フォルダはsource code(ソースコード)の略で、プログラムのメインファイルを格納するための専用フォルダです。プロジェクトの整理整頓において重要な役割を果たします。

サンプルデータ用フォルダの作成

  1. 同じくエクスプローラーパネルで「新しいフォルダ」アイコンをクリック
  2. フォルダ名を「sample_data」として作成

sample_data」フォルダは、サンプル用のデータファイルを保管するためのフォルダです。今回のプロジェクトでは、書店の書籍情報XMLファイルがここに保存されます。

メインプログラムファイルの作成

  1. 先ほど作成した「src」フォルダをクリックして選択
  2. 新しいファイル」アイコン(ファイルの絵とプラスのマークがあるアイコン)をクリック
  3. ファイル名を「data_converter.py」として作成

この「data_converter.py」ファイルが、今回の書店データ変換機能を実装するメインプログラムとなります。.py拡張子Pythonスクリプトファイルであることを示しており、実行可能なプログラムコードを記述するために使用します。

書籍情報XMLサンプルファイルの準備

今回のプロジェクトで使用する書籍カタログのXMLファイルは、下記からダウンロードしてください。

ダウンロードしたファイルは「sample_data」フォルダ内に「books_catalog.xml」として保存してください。

books_catalog.xml」ファイルは、書店の書籍カタログ情報を格納するXMLファイルです。XML(eXtensible Markup Language)は、データを構造化して記述するためのマークアップ言語で、多くのシステム間でのデータ交換に使用されています。

依存関係管理ファイルの作成

  1. プロジェクトのルートフォルダ(bookstore_converter)をクリックして選択
  2. 新しいファイル」アイコンをクリック
  3. ファイル名を「requirements.txt」として作成

requirements.txtファイルは、Pythonプロジェクトで使用する外部ライブラリとそのバージョンを記録するための重要なファイルです。これにより、他の開発者や本番環境でも同じライブラリ環境を再現できます。

requirements.txtの内容設定

作成した「requirements.txt」ファイルをVSCodeで開き、以下の内容を記述してください。

xmltodict==0.14.2

今回のプロジェクトでは、xmltodictというライブラリを使用します。

  • xmltodict XMLデータをPythonの辞書(dictionary)形式に変換するためのライブラリです。XMLの複雑な構造を、Pythonで扱いやすいデータ形式に簡単に変換できる便利なツールです。書店の書籍情報XMLを効率的に処理する際に使用します

プロジェクト構造の確認

この時点で、VSCodeのエクスプローラーパネルには以下のような構造が表示されているはずです。

bookstore_converter/
├── myenv/                      # 仮想環境フォルダ
├── src/
│   └── data_converter.py       # メインプログラムファイル
├── sample_data/
│   └── books_catalog.xml       # 書籍情報XMLファイル
├── requirements.txt            # 依存関係管理ファイル
├── README.md                   # プロジェクト説明書(GitHub作成時に自動生成)
└── .gitignore                  # Git除外設定ファイル(GitHub作成時に自動生成)

この基本構造が、今回の書店データ変換プロジェクトの基盤となります。GitHubで作成したリポジトリをクローンしたため、README.md.gitignoreファイルが最初から含まれています。

仮想環境が正常にアクティベートされていることを再度確認し(ターミナルに「(myenv)」が表示されている状態)、次のステップに進む準備を整えましょう。

ライブラリのインストール

仮想環境がアクティベートされている状態で、VSCodeのターミナルから以下のコマンドを実行します。

pip install -r requirements.txt

このコマンドにより、requirements.txtに記載されたxmltodictライブラリがインストールされます。インストール処理には数十秒程度かかる場合がありますので、しばらくお待ちください。

インストールが完了すると、ターミナルに「Successfully installed xmltodict-0.14.2」のようなメッセージが表示され、プロジェクトの環境準備が完了します。

Step2:XMLファイル読み込み機能の実装

このステップでは、書店の書籍カタログXMLファイルを読み込み、XMLデータの構造を理解して変換処理を行うための基盤機能を実装します。

書籍カタログXMLファイルの内容確認

まず、ダウンロードした「books_catalog.xml」ファイルの構造を確認しましょう。VSCodeでファイルを開いて内容を確認してください。

このXMLファイルには以下の要素が含まれています

  • store_info 書店の基本情報(店名、所在地、カタログ作成日)
  • books 書籍データのコンテナ要素
  • book 個別の書籍情報(タイトル、著者、価格、在庫数など)

XMLの階層構造を理解することで、後の変換処理がスムーズに進められます。

DataConverterクラスの作成

続いて、XML→JSON変換機能をまとめて管理するクラスを作成します。このクラスの中に、今後必要な機能をすべてdef文(関数)として実装していきます。

VSCodeで「src/data_converter.py」ファイルを開き、以下のコードを記述してください。

# 必要なライブラリをインポート
import json          # JSON形式での出力に使用
import xmltodict     # XMLを辞書形式に変換するライブラリ
import os            # ファイル操作やパス処理に使用


class DataConverter:
    # クラスの初期化メソッド
    def __init__(self, input_folder, output_folder):
        self.input_folder = input_folder    # 入力ファイルがあるフォルダパス
        self.output_folder = output_folder  # 出力ファイルを保存するフォルダパス
        self.books_data = None              # 読み込んだデータを保存する変数

initメソッドはクラスの初期化を行う特別な関数です。ここで入力フォルダと出力フォルダのパスを受け取り、データ保存用の変数を初期化します。

XMLファイル存在確認機能

次に、クラス内にcheck_file_existsメソッドを実装します。

    # ファイルが存在するかチェックするメソッド
    def check_file_exists(self, file_path):
        # os.path.isfile()でファイルの存在を確認
        if not os.path.isfile(file_path):
            # ファイルが見つからない場合のエラーメッセージ
            print(f"指定されたファイルが見つかりません: {file_path}")
            return False
        # ファイルが見つかった場合の確認メッセージ
        print(f"ファイルを確認しました: {file_path}")
        return True

このメソッドはクラス内で定義されているため、selfキーワードを使用してクラスの属性にアクセスできます。

ファイル存在確認について

os.path.isfile()関数は、指定されたパスにファイルが存在するかを確認する重要な機能です。ファイルが存在しない場合にプログラムがエラーで停止することを防げます。

XMLファイル読み込み機能の実装

まず、DataConverterクラス内のread_xml_fileメソッドを実装して、XMLファイルの内容を文字列として読み込みます。

    # XMLファイルを読み込むメソッド
    def read_xml_file(self, xml_file_path):
        try:
            # 読み込み開始のメッセージを表示
            print(f"XMLファイルを読み込み中: {xml_file_path}")
            # with文でファイルを安全に開く(自動でファイルを閉じる)
            with open(xml_file_path, 'r', encoding='utf-8') as xml_file:
                # ファイル全体を文字列として読み込み
                xml_content = xml_file.read()
            # 読み込み完了のメッセージを表示
            print("XMLファイルの読み込みが完了しました")
            # 読み込んだ内容を返す
            return xml_content
        except FileNotFoundError:
            # ファイルが見つからないエラーの処理
            print(f"エラー: ファイルが見つかりません - {xml_file_path}")
            return None
        except Exception as e:
            # その他のエラーの処理
            print(f"ファイル読み込みエラー: {str(e)}")
            return None

このメソッドは、with文を使用してファイルを安全に開き、内容を読み込みます。encoding=’utf-8′で日本語文字も正しく読み込めます。

XMLパーシング機能の実装

XMLデータを辞書形式に変換するメソッドをクラス内に追加します。

    # XMLデータを辞書形式に変換するメソッド
    def parse_xml_to_dict(self, xml_content):
        try:
            # パーシング開始のメッセージを表示
            print("XMLデータを解析中...")
            # xmltodict.parse()でXML文字列を辞書に変換
            parsed_data = xmltodict.parse(xml_content)
            # パーシング完了のメッセージを表示
            print("XMLデータの解析が完了しました")
            # 変換された辞書データを返す
            return parsed_data
        except Exception as e:
            # エラーが発生した場合の処理
            print(f"XMLパーシングエラー: {str(e)}")
            return None

xmltodict.parse()関数を使用してXML文字列をPythonの辞書データに変換します。これにより、JSONへの変換準備が整います。

データ構造確認機能の実装

解析されたデータの構造を確認するメソッドをクラス内に追加します。

    # 解析されたデータの構造を表示するメソッド
    def display_data_structure(self, data):
        # データが空の場合の処理
        if not data:
            print("表示するデータがありません")
            return
        
        # データ構造確認の開始メッセージ
        print("\n=== データ構造の確認 ===")
        
        # books_catalogキーが存在するかチェック
        if 'books_catalog' in data:
            catalog = data['books_catalog']
            
            # 書店情報の表示
            if 'store_info' in catalog:
                store_info = catalog['store_info']
                # get()メソッドでキーが無い場合のデフォルト値を設定
                print(f"書店名: {store_info.get('store_name', '不明')}")
                print(f"所在地: {store_info.get('location', '不明')}")
                print(f"カタログ作成日: {store_info.get('catalog_date', '不明')}")
            
            # 書籍情報の表示
            if 'books' in catalog and 'book' in catalog['books']:
                books = catalog['books']['book']
                # リストの場合は長さを取得、単一要素の場合は1
                book_count = len(books) if isinstance(books, list) else 1
                print(f"登録書籍数: {book_count}冊")
                
                # 最初の書籍をサンプルとして表示
                if isinstance(books, list) and books:
                    sample_book = books[0]
                    print(f"サンプル書籍: {sample_book.get('title', '不明')}")
                    print(f"著者: {sample_book.get('author', '不明')}")

このメソッドでは、解析されたデータから主要な情報を抽出して表示します。get()メソッドを使用してキーが存在しない場合のエラーを回避しています。

メイン変換処理機能の実装

convert_xml_to_jsonメソッドを実装して、XML読み込みからデータ確認までの処理をまとめます。

    # XML→JSON変換の全体処理をまとめるメソッド
    def convert_xml_to_json(self, xml_filename):
        # 入力フォルダとファイル名を結合してフルパスを作成
        xml_file_path = os.path.join(self.input_folder, xml_filename)
        
        # ファイルの存在確認
        if not self.check_file_exists(xml_file_path):
            return False
        
        # XMLファイルの読み込み
        xml_content = self.read_xml_file(xml_file_path)
        if xml_content is None:
            return False
        
        # XMLデータの辞書への変換
        self.books_data = self.parse_xml_to_dict(xml_content)
        if self.books_data is None:
            return False
        
        # データ構造の確認・表示
        self.display_data_structure(self.books_data)
        return True

このメソッドは、os.path.join()関数を使用してファイルパスを安全に結合し、各処理の成功・失敗を確認しながら進行します。

メイン実行部分の実装

main関数を実装して、データ変換処理を実行します。

# プログラムのメイン処理
def main():
    # プログラム開始のメッセージ
    print("=== 書店データ変換ツール ===")
    
    # 各フォルダとファイル名の設定
    input_folder = "sample_data"           # 入力ファイルがあるフォルダ
    output_folder = "converted_data"       # 出力ファイルを保存するフォルダ
    xml_filename = "books_catalog.xml"     # 変換するXMLファイル名
    
    # DataConverterクラスのインスタンスを作成
    converter = DataConverter(input_folder, output_folder)
    
    # XML→JSON変換処理の実行
    success = converter.convert_xml_to_json(xml_filename)
    
    # 処理結果に応じたメッセージ表示
    if success:
        print("\nStep2の処理が正常に完了しました")
    else:
        print("\nStep2の処理中にエラーが発生しました")


# このファイルが直接実行された場合のみmain関数を呼び出す
if __name__ == "__main__":
    main()

動作テスト実行

VSCodeのターミナルでプログラムを実行してテストします。

python src/data_converter.py

出力結果例

=== 書店データ変換ツール ===
ファイルを確認しました: sample_data/books_catalog.xml
XMLファイルを読み込み中: sample_data/books_catalog.xml
XMLファイルの読み込みが完了しました
XMLデータを解析中...
XMLデータの解析が完了しました

=== データ構造の確認 ===
書店名: 青空書店
所在地: 東京都渋谷区
カタログ作成日: 2024-12-01
登録書籍数: 8冊
サンプル書籍: プログラミング入門
著者: 田中太郎

Step2の処理が正常に完了しました

この出力により、XMLファイルが正常に読み込まれ、データ構造が正しく解析されていることが確認できます。

Step3:JSON変換と保存機能の実装

このステップでは、Step2で読み込んだXMLデータをJSON形式に変換し、ファイルとして保存する機能を実装します。また、出力フォルダの自動作成機能も追加して、プログラムの利便性を向上させます。

出力フォルダ作成機能の追加

まず、DataConverterクラスにcreate_output_folderメソッドを追加します。VSCodeで「src/data_converter.py」ファイルを開き、以下のメソッドを追加してください。

    # 出力先フォルダを作成するメソッド
    def create_output_folder(self):
        # フォルダが存在しない場合の処理
        if not os.path.exists(self.output_folder):
            # makedirs()で指定パスにフォルダを作成
            os.makedirs(self.output_folder)
            print(f"出力フォルダを作成しました: {self.output_folder}")
        else:
            # フォルダが既に存在する場合のメッセージ
            print(f"出力フォルダが既に存在します: {self.output_folder}")

os.makedirs()関数は指定されたパスにフォルダを作成します。os.path.exists()関数でフォルダの存在を事前に確認し、重複作成を防げます。

JSON変換機能の実装

続いて、XMLから変換された辞書データをJSON形式に変換するメソッドを追加します。

    # 辞書データをJSON文字列に変換するメソッド
    def convert_dict_to_json(self, data):
        try:
            # JSON変換開始のメッセージ
            print("辞書データをJSON形式に変換中...")
            # json.dumps()で辞書をJSON文字列に変換
            # ensure_ascii=False: 日本語文字をそのまま出力
            # indent=4: 読みやすいように4スペースでインデント
            json_data = json.dumps(data, ensure_ascii=False, indent=4)
            # 変換完了のメッセージ
            print("JSON変換が完了しました")
            # 変換されたJSON文字列を返す
            return json_data
        except Exception as e:
            # エラーが発生した場合の処理
            print(f"JSON変換エラー: {str(e)}")
            return None

json.dumps()関数はPythonの辞書データをJSON文字列に変換します。ensure_ascii=Falseで日本語文字を正しく出力し、indent=4で読みやすい形式に整えています。

JSONファイル保存機能の実装

JSON文字列をファイルに保存するメソッドをクラスに追加します。

    # JSON文字列をファイルに保存するメソッド
    def save_json_file(self, json_data, json_filename):
        # 出力フォルダとファイル名を結合してフルパスを作成
        json_file_path = os.path.join(self.output_folder, json_filename)
        
        try:
            # ファイル保存開始のメッセージ
            print(f"JSONファイルを保存中: {json_file_path}")
            # with文でファイルを安全に開く(書き込みモード)
            with open(json_file_path, 'w', encoding='utf-8') as json_file:
                # write()メソッドでJSON文字列をファイルに書き込み
                json_file.write(json_data)
            # 保存完了のメッセージ
            print("JSONファイルの保存が完了しました")
            return True
        except Exception as e:
            # エラーが発生した場合の処理
            print(f"ファイル保存エラー: {str(e)}")
            return False

with文を使用してファイルを安全に開き、write()メソッドでJSON文字列を書き込みます。encoding=’utf-8′で日本語文字も正しく保存されます。

ファイルサイズ確認機能の実装

保存されたJSONファイルのサイズを確認するメソッドを追加します。

    # 保存されたファイルのサイズを確認するメソッド
    def check_file_size(self, file_path):
        try:
            # os.path.getsize()でファイルサイズを取得(バイト単位)
            file_size = os.path.getsize(file_path)
            # 1024バイト以上の場合はKB単位で表示
            if file_size > 1024:
                size_kb = file_size / 1024
                print(f"ファイルサイズ: {size_kb:.2f} KB")
            else:
                # 1024バイト未満の場合はバイト単位で表示
                print(f"ファイルサイズ: {file_size} bytes")
            # ファイルサイズを返す
            return file_size
        except Exception as e:
            # エラーが発生した場合の処理
            print(f"ファイルサイズ取得エラー: {str(e)}")
            return 0

os.path.getsize()関数でファイルサイズを取得し、1024バイト以上の場合はKB単位で表示します。変換処理の成功確認に活用できます。

メイン変換処理機能の更新

既存のconvert_xml_to_jsonメソッドを更新して、JSON変換と保存処理を追加します。

    # XML→JSON変換の全体処理をまとめるメソッド(更新版)
    def convert_xml_to_json(self, xml_filename, json_filename):
        # 入力フォルダとファイル名を結合してフルパスを作成
        xml_file_path = os.path.join(self.input_folder, xml_filename)
        
        # ファイルの存在確認
        if not self.check_file_exists(xml_file_path):
            return False
        
        # XMLファイルの読み込み
        xml_content = self.read_xml_file(xml_file_path)
        if xml_content is None:
            return False
        
        # XMLデータの辞書への変換
        self.books_data = self.parse_xml_to_dict(xml_content)
        if self.books_data is None:
            return False
        
        # データ構造確認をコメントアウト(詳細表示が不要になったため)
        # self.display_data_structure(self.books_data)
        
        # 出力フォルダの作成
        self.create_output_folder()
        
        # 辞書データをJSON文字列に変換
        json_data = self.convert_dict_to_json(self.books_data)
        if json_data is None:
            return False
        
        # JSON文字列をファイルに保存
        success = self.save_json_file(json_data, json_filename)
        if success:
            # 保存成功時はファイルサイズも確認
            json_file_path = os.path.join(self.output_folder, json_filename)
            self.check_file_size(json_file_path)
        
        # 処理結果を返す
        return success

このメソッドでは以下の変更を行いました:

  • 引数にjson_filename追加 出力JSONファイル名を指定可能
  • display_data_structureをコメントアウト 詳細表示が不要になったため
  • 新しい処理ステップ追加 フォルダ作成、JSON変換、ファイル保存、サイズ確認

変換結果確認機能の実装

保存されたJSONファイルの内容を確認するメソッドを追加します。

    # 保存されたJSONファイルの内容を確認するメソッド
    def verify_conversion_result(self, json_filename):
        # 出力フォルダとファイル名を結合してフルパスを作成
        json_file_path = os.path.join(self.output_folder, json_filename)
        
        # ファイルの存在確認
        if not self.check_file_exists(json_file_path):
            return False
        
        try:
            # with文でJSONファイルを読み込み
            with open(json_file_path, 'r', encoding='utf-8') as json_file:
                # json.load()でJSONファイルを辞書として読み込み
                loaded_data = json.load(json_file)
            
            # 変換結果確認の開始メッセージ
            print("\n=== 変換結果の確認 ===")
            # books_catalogキーが存在するかチェック
            if 'books_catalog' in loaded_data:
                catalog = loaded_data['books_catalog']
                
                # 書店情報の表示
                if 'store_info' in catalog:
                    store_info = catalog['store_info']
                    print(f"書店名: {store_info.get('store_name', '不明')}")
                
                # 書籍数の表示
                if 'books' in catalog and 'book' in catalog['books']:
                    books = catalog['books']['book']
                    # リストの場合は長さを取得、単一要素の場合は1
                    book_count = len(books) if isinstance(books, list) else 1
                    print(f"変換済み書籍数: {book_count}冊")
            
            return True
        except Exception as e:
            # エラーが発生した場合の処理
            print(f"変換結果確認エラー: {str(e)}")
            return False

json.load()関数で保存されたJSONファイルを読み込み、変換が正常に完了していることを確認します。

メイン実行部分の更新

main関数を更新して、新しいJSON変換機能を活用します。

# プログラムのメイン処理(更新版)
def main():
    # プログラム開始のメッセージ
    print("=== 書店データ変換ツール ===")
    
    # 各フォルダとファイル名の設定
    input_folder = "sample_data"               # 入力ファイルがあるフォルダ
    output_folder = "converted_data"           # 出力ファイルを保存するフォルダ
    xml_filename = "books_catalog.xml"         # 変換するXMLファイル名
    json_filename = "converted_books.json"     # 出力するJSONファイル名
    
    # DataConverterクラスのインスタンスを作成
    converter = DataConverter(input_folder, output_folder)
    
    # XML→JSON変換処理の実行(引数にJSONファイル名も追加)
    success = converter.convert_xml_to_json(xml_filename, json_filename)
    
    # 処理結果に応じたメッセージ表示
    if success:
        print("\nXML→JSON変換が正常に完了しました")
        # 変換結果の確認処理を実行
        converter.verify_conversion_result(json_filename)
        # Step3完了メッセージをコメントアウト
        # print("\nStep3の処理が正常に完了しました")
    else:
        print("\nXML→JSON変換中にエラーが発生しました")


# このファイルが直接実行された場合のみmain関数を呼び出す
if __name__ == "__main__":
    main()

この更新では以下の変更を行いました:

  • json_filename変数追加 出力JSONファイル名を指定
  • convert_xml_to_json呼び出し更新 引数にjson_filenameを追加
  • verify_conversion_result呼び出し追加 変換結果の確認処理
  • Step3完了メッセージをコメントアウトし具体的なメッセージに変更

動作テスト実行

VSCodeのターミナルでプログラムを実行してテストします。

python src/data_converter.py

出力結果例

=== 書店データ変換ツール ===
ファイルを確認しました: sample_data/books_catalog.xml
XMLファイルを読み込み中: sample_data/books_catalog.xml
XMLファイルの読み込みが完了しました
XMLデータを解析中...
XMLデータの解析が完了しました
出力フォルダを作成しました: converted_data
辞書データをJSON形式に変換中...
JSON変換が完了しました
JSONファイルを保存中: converted_data/converted_books.json
JSONファイルの保存が完了しました
ファイルサイズ: 3.45 KB

XML→JSON変換が正常に完了しました
ファイルを確認しました: converted_data/converted_books.json

=== 変換結果の確認 ===
書店名: 青空書店
変換済み書籍数: 8冊

この出力により、XMLファイルが正常にJSONファイルに変換され、converted_dataフォルダに保存されていることが確認できます。生成されたJSONファイルはVSCodeで開いて内容を確認することも可能です。

Step4:プロジェクトをGitHubにアップロード

このステップでは、完成した書店データ変換プロジェクトをGitHubにアップロードし、ポートフォリオとして活用できる形にします。最終的なファイル整理とコードの公開を行っていきます。

.gitignoreファイルの更新

既存の.gitignoreファイルに、プロジェクト固有の除外設定を追加します。

VSCodeで「.gitignore」ファイルを開き、以下の内容を末尾に追加してください。

# Virtual environment
myenv/

# Converted data files
converted_data/
*.json
*.xml

これらを追加する理由について説明します。

  • myenv/ 仮想環境フォルダはプロジェクト固有のため、リポジトリに含める必要がありません
  • converted_data/ プログラム実行時に生成される変換結果フォルダを除外
  • *.json 変換処理で生成されるJSONファイルを除外
  • *.xml サンプルXMLファイルなどの一時的なデータファイルを除外

README.mdファイルの更新

リポジトリ作成時に生成されたREADME.mdファイルの内容を、プロジェクトの詳細情報に更新します。

VSCodeで「README.md」ファイルを開き、内容を以下のように全て置き換えてください。

# 書店システム用XMLデータ変換ツール

## プロジェクト内容
書店の書籍カタログXMLファイルをJSON形式に変換するデータ変換ツールです。XMLデータの読み込み、パーシング、JSON変換、ファイル保存まで一連の処理を自動化し、書店システムのデータ管理を効率化します。PythonによるXML処理とJSONデータ変換技術を学習することを目的として実装しました。

## プロジェクト構成
```
bookstore_converter/
├── src/
│   └── data_converter.py    # メインプログラム
├── sample_data/
│   └── books_catalog.xml    # サンプル書籍データ
├── converted_data/          # 変換結果出力フォルダ
├── requirements.txt         # 依存関係管理
├── README.md               # プロジェクト説明書
└── .gitignore              # Git除外ファイル設定
```

## 必要要件/開発環境
- **Python 3.7以上**
- **VSCode** (開発環境)
- **Git** (バージョン管理)

### 使用ライブラリ
- **xmltodict** XMLデータの辞書変換処理
- **json** JSON形式データの変換・保存処理
- **os** ファイルシステム操作

## 機能
- **XMLファイル読み込み** 書籍カタログXMLの自動読み込み
- **データ構造解析** XMLデータの階層構造を辞書形式に変換
- **JSON形式変換** 辞書データをJSON文字列に変換
- **ファイル自動保存** 変換結果を指定フォルダに保存
- **フォルダ自動作成** 出力フォルダの存在確認と自動作成
- **変換結果確認** 保存されたJSONファイルの内容検証
- **エラーハンドリング** ファイル操作や変換処理のエラー対応
- **ファイルサイズ確認** 変換後ファイルのサイズ表示

## 実行方法

### 1. リポジトリのクローン
```bash
git clone https://github.com/yourusername/bookstore_converter.git
cd bookstore_converter
```

### 2. 仮想環境の作成・アクティベート

**Windows**
```bash
python -m venv myenv
myenv\Scripts\activate
```

**macOS**
```bash
python3 -m venv myenv
source myenv/bin/activate
```

### 3. 依存関係のインストール
```bash
pip install -r requirements.txt
```

### 4. プログラムの実行
```bash
python src/data_converter.py
```

実行後、sample_data/books_catalog.xmlがJSONファイルに変換され、converted_dataフォルダに保存されます。

## データ形式について
- **入力データ** XML形式の書籍カタログファイル
- **出力データ** JSON形式の変換済みデータファイル
- **サンプルデータ** 8冊の書籍情報を含む実データ

## 開発者
YuYu

プロジェクトのコミット・プッシュ

プロジェクトの全ての変更をGitHubに反映させましょう。

変更のステージングとコミット

  1. VSCodeの左側のアクティビティバーからソース管理アイコンをクリックします
  2. 変更内容セクションで、すべての変更ファイルを確認します
  3. 各ファイルの横にある「+」アイコンをクリックしてステージングします
  4. コミットメッセージ入力欄に「Add bookstore XML to JSON converter system」と入力します
  5. コミット」ボタンをクリックします

GitHubへのプッシュ

  1. コミット完了後、「変更の同期」または「プッシュ」ボタンをクリックします
  2. 初回の場合、GitHub認証が求められる場合があります
  3. 認証完了後、ローカルの変更がGitHubリポジトリに反映されます

GitHubでの確認

プロジェクトが正常にアップロードされたか確認しましょう。

  1. ブラウザでGitHubリポジトリページを開きます
  2. 以下のファイルが正しくアップロードされていることを確認します
  • src/data_converter.py (メインプログラムファイル)
  • sample_data/books_catalog.xml (サンプルデータファイル)
  • requirements.txt (依存関係管理ファイル)
  • README.md (更新されたプロジェクト説明書)
  • .gitignore (更新された除外設定ファイル)
  1. README.mdが適切に表示され、プロジェクトの説明が読みやすく表示されていることを確認します
  2. ファイル一覧にmyenv/フォルダやconverted_data/フォルダが含まれていないことを確認します(.gitignoreで除外されているため)

これで本格的な書店データ変換システムが完成し、GitHubでのポートフォリオ公開も完了しました。作成したプロジェクトは、就職活動や案件獲得時の実績として活用できる実用的なシステムとなっています。

まとめ

このプロジェクトを通じて、XMLからJSONへのデータ変換技術の基礎から実践的な応用まで幅広く学習することができました。

得られたスキル

  • xmltodictライブラリ XMLデータの辞書変換技術
  • JSON操作 json.dumps、json.loadによるデータ変換
  • ファイル操作 open、read、writeによる基本的なファイル処理
  • フォルダ操作 os.makedirs、os.path.existsによるディレクトリ管理

得られた経験

  • 異なるデータ形式間での変換処理経験
  • ファイルとフォルダの自動化処理の習得
  • エラーハンドリングを含む安定したプログラム開発
  • プロジェクト管理の基本的な流れの理解
  • GitHubを使用したバージョン管理の実践的経験

得られた成果物

  • 完全に動作するデータ変換システム
  • GitHubでのポートフォリオとして活用可能なプロジェクト
  • 完全なPythonソースコード

次に学ぶべきこと

  • pandasライブラリを使用したCSVファイルの読み書き機能の追加
  • 複数ファイルの一括変換処理機能の実装
  • 設定ファイル(config.json)を使用した変換設定の外部化
  • ログ出力機能の追加による処理履歴の記録
  • コマンドライン引数を使用したファイル指定機能の実装

このプロジェクトから応用することでできること

  • ECサイトの商品データ変換による在庫管理システムへの活用
  • 設定ファイルの形式変換による異なるシステム間でのデータ移行
  • APIレスポンスデータの変換による外部サービス連携機能の開発
  • バックアップデータの形式変換による古いシステムからの移行作業
  • レポート形式の変換による業務効率化ツールとしての活用
  • データ変換代行サービスの小規模案件への対応

このデータ変換技術を基盤として、様々な業務でのファイル処理自動化ニーズに対応できるツールを開発することが可能です。特に、定期的なデータ形式変換や複数ファイルの一括処理が必要な業務では、高い価値を提供できる技術として活用できます。

この記事が気に入ったら
フォローしてね!

この記事が参考になった方はシェアしてね!
  • URLをコピーしました!

本コンテンツへの意見や質問

コメントする

目次