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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7253閲覧

XMLファイルで、指定した文字列を検索し、その位置情報を取得したい。

UMA00

総合スコア18

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/08/07 05:52

編集2016/08/07 06:22

###前提・実現したいこと
XMLファイルで、指定した文字列を検索し、その位置情報を取得したい。

###発生している問題・エラーメッセージ
以下、インプットのXMLファイルのrankの値が1の部分の行番号を取得したい。
※.find("指定した文字列")で、行頭から何文字目かは分かった。

###インプットのXMLファイル

Python

1<?xml version="1.0"?> 2<data> 3 <country name="Liechtenstein"> 4 <rank>1</rank> 5 <year>2008</year> 6 <gdppc>141100</gdppc> 7 <neighbor name="Austria" direction="E"/> 8 <neighbor name="Switzerland" direction="W"/> 9 </country> 10 <country name="Singapore"> 11 <rank>4</rank> 12 <year>2011</year> 13 <gdppc>59900</gdppc> 14 <neighbor name="Malaysia" direction="N"/> 15 </country> 16 <country name="Panama"> 17 <rank>68</rank> 18 <year>2011</year> 19 <gdppc>13600</gdppc> 20 <neighbor name="Costa Rica" direction="W"/> 21 <neighbor name="Colombia" direction="E"/> 22 </country> 23</data>

###編集ファイル

Python

1# -*- coding: utf-8 -*- 2f = open('country_data.xml', 'r')# inputファイル'country_data.xml'を読み込み、変数textに代入 3text = f.read() 4f.close 5import xml.etree.ElementTree as ET# XML parser のimport 6root = ET.fromstring(text) 7import inspect 8for rank in root.findall("./country/rank"): 9 if rank.text == '1': 10 print text.find(rank.text) # =>15 11 print inspect.currentframe().f_lineno # =>11

###試したこと
上記のように、
inspect をimportし、
print inspect.currentframe().f_line
とすると、XMLファイル内ではなく、この編集ファイルの何行目か(11行目)と出力されてしまうことを確認した。

###補足情報(言語/FW/ツール等のバージョンなど)
使用言語:Python

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

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

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

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

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

asahina_dev

2016/08/07 06:15

コード部分を選択肢 < /> をクリックしてください
UMA00

2016/08/07 07:53

修正しました、失礼しました。
guest

回答1

0

ベストアンサー

細かくは検証していないですが、

Stackoverflowの
この質問 is-there-a-way-to-get-a-line-number-from-an-elementtree-element

Duncan Harris の 回答
のクラスを使うと実現できました。

パーサーを拡張しています。
クラスを(root=より前の行に)置いて、

root = ET.fromstring(text, parser=LineNumberingParser())

と使えば行や列がわかるようです。

py

1root = ET.fromstring(text, parser=LineNumberingParser()) 2import inspect 3for rank in root.findall("./country/rank"): 4 if rank.text == '1': 5 print rank._start_line_number 6

ちなみに回答だと
tree = ET.parse(filename), parser=LineNumberingParser())
となってますけど、 filenameの後の )はいらないですね。
(Stackoverflowだと1文字の修正ができないのでそのままなってるのかもしれない。コメントつけとこ。)

投稿2016/08/07 06:43

flied_onion

総合スコア2604

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

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

UMA00

2016/08/07 07:54

無事、行番号を取得することができました。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問