• 締切済み

PythonでXMLをcsvに変換したいです。

pythonで、特定のファルダにXMLファイルが追加されるたびにCSVファイルを新しく作成してそこに書き込んでいくという事がしたいのですが、なかなかうまくいかず困っています。 下記のようなXMLなのですが、どうしたら良いのでしょうか? <?xml version="1.0" encoding="UTF-8"?> <file format="current_readings" version="1.25" name="test.xml" author="verxxx x.xx"> <base> <serial>563C10SS</serial> <model>XXX-XXXX</model> <name>ABC1</name> <time_diff>540</time_diff> <std_bias>0</std_bias> <dst_bias>0</dst_bias> <time_zone>(UTC+09:00) 大阪、札幌、東京</time_zone> <lan> <input>0</input> <output>0</output> </lan> </base> <group> <num>0</num> <name>Group1</name> <remote> <serial>AAAAAAA1</serial> <model>XXX-NNN</model> <num>1</num> <name>Unit01</name> <rssi repeater="0">5</rssi> <ch> <num>1</num> <scale_expr></scale_expr> <name></name> <current> <unix_time>1538008469</unix_time> <time_str>2018-09-27 09:34:29</time_str> <value valid="true">25.0</value> <unit>C</unit> <batt>5</batt> </current> <record> <type>13</type> <unix_time>1538007269</unix_time> <data_id>884</data_id> <interval>300</interval> <count>5</count> <data> 2a0f0a605f560== </data> </record> </ch> <ch> <num>2</num> <scale_expr></scale_expr> <name></name> <current> <unix_time>1538008469</unix_time> <time_str>2018-09-27 09:34:29</time_str> <value valid="true">61</value> <unit>%</unit> <batt>5</batt> </current> <record> <type>208</type> <unix_time>1538007269</unix_time> <data_id>884</data_id> <interval>300</interval> <count>5</count> <data> das54f0565== </data> </record> </ch> </remote> <remote> <serial>BBBBBBB1</serial> <model>XXX-NNN</model> <num>2</num> <name>Unit02</name> <rssi repeater="0">3</rssi> <ch> <num>1</num> <scale_expr></scale_expr> <name></name> <current> <unix_time>1538008192</unix_time> <time_str>2018-09-27 09:29:52</time_str> <value valid="true">26.0</value> <unit>C</unit> <batt>5</batt> </current> <record> <type>13</type> <unix_time>1538006992</unix_time> <data_id>883</data_id> <interval>300</interval> <count>5</count> <data> 54829652hughA== </data> </record> </ch> <ch> <num>2</num> <scale_expr></scale_expr> <name></name> <current> <unix_time>1538008192</unix_time> <time_str>2018-09-27 09:29:52</time_str> <value valid="true">58</value> <unit>%</unit> <batt>5</batt> </current> <record> <type>208</type> <unix_time>1538006992</unix_time> <data_id>883</data_id> <interval>300</interval> <count>5</count> <data> 481762opjuhgft== </data> </record> </ch> </remote> <remote> <serial>AAABB2</serial> <model>XXX-NNN</model> <num>3</num> <name>Unit03</name> <rssi repeater="0">3</rssi> <ch> <num>1</num> <scale_expr></scale_expr> <name></name> <current> <unix_time>1538008214</unix_time> <time_str>2018-09-27 09:30:14</time_str> <value valid="true">26.5</value> <unit>C</unit> <batt>5</batt> </current> <record> <type>13</type> <unix_time>1538007014</unix_time> <data_id>883</data_id> <interval>300</interval> <count>5</count> <data> 7wTvBPEE8gTxBA== </data> </record> </ch> <ch> <num>2</num> <scale_expr></scale_expr> <name></name> <current> <unix_time>1538008214</unix_time> <time_str>2018-09-27 09:30:14</time_str> <value valid="true">55</value> <unit>%</unit> <batt>5</batt> </current> <record> <type>208</type> <unix_time>1538007014</unix_time> <data_id>883</data_id> <interval>300</interval> <count>5</count> <data> f6a72f5aaa== </data> </record> </ch> </remote> </group> </file>

みんなの回答

  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.2

こんなものをだらだら引用しなくたって、要するにタグで構造化されたテキストを扱うなら、Pythonなんかは大得意な話です。 何をimportしてもいいんですが、まあbeautifulsoupでも持ってくれば一発でしょう。そんなことをしなくても大丈夫は大丈夫ですけど。 その上質問があるならお聞きしますけど、普通はあっさりできることをこんなまるごとやってくれと言わんばかりの言い方だったら答える気にもなりません。本人が何もしないで人に教えてくれというのは褒められたことじゃありませんよ。

  • hiodraiu
  • ベストアンサー率15% (448/2823)
回答No.1

何が上手くか無いのか書かないと答えようがないと思いませんか。 少なくとも、私の部下がこんな質問してくるようなら問題視します。 文頭で「Pythonで」と書かれたら、言語に依存した質問だと思うのですが、これだけタグを羅列されたら、XMLをCSVに変換する際の仕様の話のようにも感じます。

date_205s
質問者

補足

文字かいっぱいで詳細が書けなくなってしまったためざっくりとした質問で失礼しました。 現状、はじめのformatからauthorは elementtrenのattribを使用して取得し、csvに書き込むことが出来たのですが、その他の子要素、孫要素の内容はどの様にデータの取得・書き込みをしたら良いのかがわからなくて困っています。

関連するQ&A

  • List<T> クラスでデータを入れても同じになる

    Wireless_unit_sigクラスというのにデータを入れていきたいのですが、読み込んだファイルの中にデータが20000データぐらいあるため、Listジェネリッククラスというので宣言してみました。 List<Wireless_unit_sig^>^ Wireless_ID_str02 = gcnew List<Wireless_unit_sig^>(); この時に、 Wireless_ID_str02[i]->day_name = split[0]; Wireless_ID_str02[i]->month = split[1]; Wireless_ID_str02[i]->day = split[2]; Wireless_ID_str02[i]->time = split[3]; Wireless_ID_str02[i]->year = split[4]; Wireless_ID_str02[i]->cmd1 = split[5]; Wireless_ID_str02[i]->cmd2 = split[6]; Wireless_ID_str02[i]->ID = split[7]; Wireless_ID_str02[i]->sig1 = split[8]; Wireless_ID_str02[i]->sig2 = split[9]; Wireless_ID_str02[i]->batt_mount = split[10]; Wireless_ID_str02[i]->m_rssi = split[11]; Wireless_ID_str02[i]->s_rssi = split[12]; Wireless_ID_str02[i]->version = split[13]; このようにデータを入れていこうとしたのですが、エラーが出るのですが、データを収納していく方法というのはどのようにしていけばよいのでしょうか? 作成したクラスは次のようなものです。 どうぞ、教えて頂きますよう、お願い致します。 ref class Wireless_unit_sig { private: public: String^ day_name; String^ month; String^ day; String^ time; String^ year; String^ cmd1; String^ cmd2; String^ ID; String^ sig1; String^ sig2; String^ batt_mount; String^ m_rssi; String^ s_rssi; String^ version; String^ s_rssi_fixed; public: Wireless_unit_sig() { day_name = "test"; month = "test"; day = "test"; time = "test"; year = "test"; cmd1 = "test"; cmd2 = "test"; ID = "test"; sig1 = "test"; sig2 = "test"; batt_mount = "test"; m_rssi = "test"; s_rssi = "test"; version = "test"; s_rssi_fixed = "test"; } }; }

  • oracleのUSER_TABLESのNUM_ROWSって?

    USER_TABLESのNUM_ROWについて教えてください。 リファレンスマニュアルを見るとNUM_ROWは表内の行数をあらわすようです。 実行してざっと見てみるとCOUNT(*)で件数を取ったのと同じ値になるケースが多いですが、 (NULL)のケースもあります。 違う数値の場合もあります。 そのNULLの表はデータ0件なのかと思ったら、しっかりと結構なデータ量があったりします。 NUM_ROWは表内の行数=レコード数かと思ったのですがどうも違うようです。 USER_TABLESのNUM_ROWとは何でしょうか? <イメージ> SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = 'TBL1' TABLE_NAME NUM_ROWS ---------- -------- TBL1 (NULL) TBL2 35 SELECT COUNT(*) FROM TBL1 count(*) -------- 980 SELECT COUNT(*) FROM TBL2 count(*) -------- 35

  • mysql分単位での統計情報

    以下のようなデータがあって、分単位での統計情報を出すにはどうすればいいのでようか。 time(Unix_time)   count_1 count_2 count_3 ----------------------------------------- 2012-02-23 13:01   0   2   0 2012-02-23 13:01   1  1   0 2012-02-23 13:01   2  2   3 2012-02-23 13:01   0  2   0 2012-02-23 13:01   1  5   2 2012-02-23 13:02   1  2   2 2012-02-23 13:02    0  1   2 2012-02-23 13:02   1  1   0 ↓ ↓ ↓ 以下のように出力させたい time(Unix_time)   count_1 count_2 count_3 ----------------------------------------- 2012-02-23 13:01   4   12   5 2012-02-23 13:02   2   4   4 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • csvからデータベースへ取り込みの際エラーが出る。

    Excelで作ったデータをPHPを利用して データベースへ登録しようとしています。 そこで下記のようなエラーが表示されます。 Fatal error: Call to undefined function: i18n_discover_encoding() in /****/****/update.php on line 55 その55行目前後は、 $delim = " ";#Tab $record = file($path.$filename); $record_num = count($record); for($i = 5; $i < $record_num; $i++){ 55行目 $old_code = i18n_discover_encoding($record[$i]); $euc_record[$i] = i18n_convert($record[$i], "EUC", "$old_code"); $euc_record[$i] = str_replace("'","\\'",$euc_record[$i]); ************************* i18n_discover_encodingが悪いようですが いまいち分かりません。 PHP4を使用しております。 初めて質問させていただく為、内容が不十分かもしれませんが、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Listジェネリッククラスのやり方がわからない。

    リストジェネリッククラスを使って、テキストファイルから取得したたくさんのデータ(数がわからない)を整理しながらWireless_ID_str02というデータの中に整理しながら入れていきたいんです。 下のプログラムでビルドはできるのですが、デバッグで見ていくと、i=20000ぐらいまで行くのですが、すべてのデータが全く同じデータで、決まって、テキストファイル内の一番最後の行のデータになってしまってました。 どうして、全く同じデータが収納されてしまうのか教えて頂けないでしょうか? どうぞ、よろしくお願いします。 List<Wireless_unit_sig^>^ Wireless_ID_str02 = gcnew List<Wireless_unit_sig^>(); Wireless_unit_sig^ Wireless_unit_sig_temp = gcnew Wireless_unit_sig(); i=0; while(( data = reader->ReadLine()) != nullptr ) { // カンマ区切りで分解 array<String^>^ split = data->Split( separator ); #if 1 Wireless_unit_sig_temp->day_name = split[0]; Wireless_unit_sig_temp->month = split[1]; Wireless_unit_sig_temp->day = split[2]; Wireless_unit_sig_temp->time = split[3]; Wireless_unit_sig_temp->year = split[4]; Wireless_unit_sig_temp->cmd1 = split[5]; Wireless_unit_sig_temp->cmd2 = split[6]; Wireless_unit_sig_temp->ID = split[7]; Wireless_unit_sig_temp->sig1 = split[8]; Wireless_unit_sig_temp->sig2 = split[9]; Wireless_unit_sig_temp->batt_mount = split[10]; Wireless_unit_sig_temp->m_rssi = split[11]; Wireless_unit_sig_temp->s_rssi = split[12]; Wireless_unit_sig_temp->version = split[13]; #endif Wireless_ID_str02->Add(Wireless_unit_sig_temp); i++; }

  • 表の結合について

    2つのテーブルがあります。(それぞれNo列が主キーです) 表A(名称:Tbl_A)に2レコードあります。 No, Str  ←列名 10,str_1  ←データ 20,str_2  ←データ 表B(名称:Tbl_B)に2レコードあります。 No, Name  ←列名 10,Name_1 ←データ 30,Name_3 ←データ このテーブルを結合して、以下のデータ(3レコード)を抽出するSQL文を教えてください。 No, Str, Name   ←列名 10,str_1,Name_1 ←データ 20,str_2,(null) ←データ 30,(null),Name_3 ←データ ポイントは、「どちらかの表にあるデータは全て抽出したい」ということです。 よろしくお願いします。

  • unsighed char数値をstringに変換

    unsigned char ch_name[18] このように宣言した変数にバイナリファイルから読み取ったデータを入れて ch_name[0] = 0x5f ch_name[1] = 0x30 ch_name[2] = 0x61 ch_name[3] = 0x30 ch_name[4] = 0x64 ch_name[5] = 0x30 ch_name[6] = 0x66 ch_name[7] = 0x30 ch_name[8] = 0x68 ch_name[9] = 0x30 ch_name[10] = 0x73 ch_name[11] = 0x00 ch_name[12] = 0x74 ch_name[13] = 0x00 ch_name[14] = 0x75 ch_name[15] = 0x00 ch_name[16] = 0x76 ch_name[17] = 0x00 これらの数値はUnicodeで”たちつてとstuv”としてバイナリに入っていた文字列なのですが、これをString strにいれて”たちつてとstuv”として収納する方法はありませんでしょうか?

  • csvファイルチェック

    いつもここで勉強させていただいています。 初めてPHPプログラムを書くことになって本をみてここの サンプルをみながらやっていく途中でどうしてもうまくいかないので皆さんの知恵をお借りしたいと思います。 <HTML> <?php //行番号表示 $leng = 0; $file_name = "roba.csv"; //区切り記号 $kigou = ","; //指定項目数 $count_koumoku = 20; // 関数呼び出し $e = koumokuCheck($file_name,$kigou,$count_koumoku); print "--;>チェック終了"; function koumokuCheck($file_name,$kigou,$count_koumoku){ $file = fopen($file_name, "r"); while ($data = fgetcsv($file, 1000,$kigou)) { //項目数カウントする $num = count ($data); if( $num != $count_koumoku) { //項目数カウントする(指定項目数より小さい場合メッセージ表示) $leng++; print "-->$leng"."<--項目数が足りてません <br>\n"; } else { $leng++; } } flock($file,LOCK_UN); fclose($file); } ?> </HTML> 上記のようなチェック機能をつくりましたが結果は一つの循環で結果(N行目が項目数が足りない)を返してくれますがここを配列を利用して項目数が足りない行番号を覚えさせて最後に足りない行番号を列挙して一つの行にまとめて表示したい(例:1,3,6,7,9の項目が足りません)と思っていますがなかなかうまくいきません!みなさんのよいアドバイスをまっています。

    • ベストアンサー
    • PHP
  • unsighed charの数値をstringに

    for(k=0;k < 6;k++) { Wireless_ID_str02[i]->Wireless_ID_str += Wireless_unit[i].wireless_id[k].ToString("X2"); } このようなブログラムを使ってWireless_unit[i].wireless_id[k] unsighed charの次の数値 Wireless_unit[i].wireless_id[0] = 1; Wireless_unit[i].wireless_id[1] = 1; Wireless_unit[i].wireless_id[2] = 1; Wireless_unit[i].wireless_id[3] = 1; Wireless_unit[i].wireless_id[4] = 1; Wireless_unit[i].wireless_id[5] = 1; これを stringの Wireless_ID_str02[i]->Wireless_ID_str この中に”111111” というように代入していきたいのですが、 実際に入ってきたのは Wireless_ID_str02[i]->Wireless_ID_str = ”test313131313131” となりました。 Wireless_ID_str02[i]->Wireless_ID_str = ”111111” という風に代入する方法はありませんでしょうか。 ”Wireless_unit”というのは Wireless_unit Wireless_unit; というので宣言しています。 struct Wireless_unit { unsigned char wireless_id[6]; unsigned char use; unsigned char tampa_sig_m1; unsigned char tampa_sig_m2; unsigned char tampa_sig_m34_set; unsigned char tampa_sig_m34_reset; unsigned char battlow_sig_m1; unsigned char battlow_sig_m2; unsigned char battlow_sig_m34_set; unsigned char battlow_sig_m34_reset; unsigned char sch_sig_m1; unsigned char sch_sig_m2; unsigned char sch_sig_m34_set; unsigned char sch_sig_m34_reset; unsigned char ch1_use; unsigned char ch1_emg_sig_m1; unsigned char ch1_emg_sig_m2; unsigned char ch1_emg_sig_m34_set; unsigned char ch1_emg_sig_m34_reset; unsigned char ch2_use; unsigned char ch2_emg_sig_m1; unsigned char ch2_emg_sig_m2; unsigned char ch2_emg_sig_m34_set; unsigned char ch2_emg_sig_m34_reset; }; また、 ”Wireless_ID_str02”は array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); このように宣言しています。 namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Wireless_unit_str { private: public: String^ Wireless_ID_str; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Wireless_unit_str() { Wireless_ID_str = "test"; } }; }

  • プログラムの異常終了

    TEST2とコマンドプロンプトに表示された後、異常終了します。 以下が実行したプログラムです。 #include<stdio.h> void get_name(char **f_name2){ printf("ファイル名を入力"); scanf("%s",*f_name2); } int count_num(FILE *fp){ int ch =0; int count=0; while((ch=fgetc(fp))!=EOF){ if(ch>0&&ch<9){ count++; } } return(count); } int main (void){ char *fname; FILE *fp; get_name(&fname); if((fp=fopen(fname,"r"))==NULL){ printf("ファイルオープンエラー"); }else{ printf("%d\n",count_num(fp)); } fclose(fp); printf("TEST2\n"); return(0); } textc13-7.exeは動作を停止しました。と表示があります。正常に終了したいので、 御指摘お願いします。

専門家に質問してみよう