質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

989閲覧

pythonでxmlファイルを解析する

kiiti_shiraishi

総合スコア14

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/11/07 02:46

前提・実現したいこと

pythonでxmlファイルを読み込み子タグの内容をlistに読み込みたいのです。
ファイルに読み込むことは出来ましたが子タグの内容を全て読み込む方法が判りません。
Netで検索しましたが初心者のため内容を理解できないこともあり困っています。
xml.etree.ElementTreeで子タグの内容を取り出しを説明しているサイト、参考書(私が」持っている
参考書にはxmlについては何の説明もありません)を教えて下さい。
具体的には下記xmlファイルの子タグ<board>の内容をlistに取り込みたいと思ってます。
下記は<board>が2つですが実際は数十あります。
board = ['1','AKT53','K82','QT3',……’AK3',’NONE','N']と孫タグの内容を、または2次元listで
board = [['Num','1'],['ns','AKT53'],['nh','K82'],……['deal','N']孫タグ名と内容を取り込みたいです。

xml file 投稿画面ではスペースが削除されているため見にくいですが子タグboardが2つ入った内容です。

<?xml version="1.0" encoding="shift_jis"?>

<HandData>……親タグ
<prop>
<title>weekly</title>
<SessionId></SessionId>
</prop>
<board>……1つ目の子タグ
<num>1</num>  以下孫タグ
<ns>AKT53</ns>
<nh>K82</nh>
<nd>QT3</nd>
<nc>Q6</nc>
<es>QJ7</es>
<eh>T64</eh>
<ed>976</ed>
<ec>J942</ec>
<ss>98</ss>
<sh>AJ93</sh>
<sd>A85</sd>
<sc>T875</sc>
<ws>642</ws>
<wh>Q75</wh>
<wd>KJ42</wd>
<wc>AK3</wc>
<vul>NONE</vul>
<deal>N</deal> 孫タグの終わり
</board>
<board>……2つ目の子タグ
<num>2</num>
<ns>87</ns>
<nh>64</nh>
<nd>T52</nd>
<nc>AQ6532</nc>
<es>QT965</es>
<eh>AT8</eh>
<ed>J64</ed>
<ec>87</ec>
<ss>4</ss>
<sh>J953</sh>
<sd>K9873</sd>
<sc>J94</sc>
<ws>AKJ32</ws>
<wh>KQ72</wh>
<wd>AQ</wd>
<wc>KT</wc>
<vul>NS</vul>
<deal>E</deal>
</board>
</HandData>

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

BeautifulSoup

python

1from bs4 import BeautifulSoup 2 3with open('data.xml') as f: 4 soup = BeautifulSoup(f, 'lxml') 5 board = [[e.name, e.text] for e in soup.select('board *')] 6 7from pprint import pprint 8pprint(board) 9 10# 11[['num', '1'], 12 ['ns', 'AKT53'], 13 ['nh', 'K82'], 14 ['nd', 'QT3'], 15 ['nc', 'Q6'], 16 ['es', 'QJ7'], 17 :

xml.etree.ElementTree

import xml.etree.ElementTree as ET with open('data.xml') as f: root = ET.fromstring(f.read()) board = [[e.tag, e.text] for e in root.findall('board/*')] from pprint import pprint pprint(board) # [['num', '1'], ['ns', 'AKT53'], ['nh', 'K82'], ['nd', 'QT3'], ['nc', 'Q6'], ['es', 'QJ7'], :

投稿2021/11/07 03:12

編集2021/11/07 03:38
melian

総合スコア20655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiiti_shiraishi

2021/11/07 05:38

xml.etree.ElementTreeで行列に取り込むことが出来ました。 ありがとうございました。
kiiti_shiraishi

2021/11/07 06:40

xmlFileを2次元のlistパース出来ましたがどの変数に入っているのでしょうか。”次元のlistを別の関数で使用したいのですが。グローバルなlistとして定義する方法を教えて下さい。参考書では「グローバル変数 = 'グローバル' 」と書かれていますが???です。
melian

2021/11/07 06:44

board 変数です。
guest

0

xml.etree.ElementTreeで子タグの内容を取り出しを説明しているサイト

公式ドキュメントに説明があります。

以下はコード例です。

python

1import xml.etree.ElementTree as ET 2 3xml_source = """<?xml version="1.0" encoding="shift_jis"?> 4<HandData> 5 <prop> 6 <title>weekly</title> 7 <SessionId></SessionId> 8 </prop> 9 <board> 10 <num>1</num> 11 <ns>AKT53</ns> 12 <nh>K82</nh> 13 <nd>QT3</nd> 14 <nc>Q6</nc> 15 <es>QJ7</es> 16 <eh>T64</eh> 17 <ed>976</ed> 18 <ec>J942</ec> 19 <ss>98</ss> 20 <sh>AJ93</sh> 21 <sd>A85</sd> 22 <sc>T875</sc> 23 <ws>642</ws> 24 <wh>Q75</wh> 25 <wd>KJ42</wd> 26 <wc>AK3</wc> 27 <vul>NONE</vul> 28 <deal>N</deal> 29 </board> 30 <board> 31 <num>2</num> 32 <ns>87</ns> 33 <nh>64</nh> 34 <nd>T52</nd> 35 <nc>AQ6532</nc> 36 <es>QT965</es> 37 <eh>AT8</eh> 38 <ed>J64</ed> 39 <ec>87</ec> 40 <ss>4</ss> 41 <sh>J953</sh> 42 <sd>K9873</sd> 43 <sc>J94</sc> 44 <ws>AKJ32</ws> 45 <wh>KQ72</wh> 46 <wd>AQ</wd> 47 <wc>KT</wc> 48 <vul>NS</vul> 49 <deal>E</deal> 50 </board> 51</HandData>""" 52 53root = ET.fromstring(xml_source) 54 55for child in root: 56 if child.tag == "board": 57 for grandchild in child: 58 print(grandchild.tag, grandchild.text)

投稿2021/11/07 03:33

etherbeg

総合スコア1195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiiti_shiraishi

2021/11/07 06:42

ありがとうがざいました。またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問