ワケあって、XMLファイルをparsingしているのだけれど、当然自力でparsingできるわけがないので、調べてみるとPythonのBeautifulSoup4がよい、とのこと。
最初はよく分からなかったが、ファイルハンドルを f とすると、
soup = BeautifulSoup(f, "xml")
で、XMLファイル自体がsoapオブジェクトに読み込まれる。このオブジェクトは
<class 'bs4.BeautifulSoup'>
というタイプ。そのまま。で、自分のXMLファイルを見ると一番大きな分類を作っているのがTopClassというタグ(しかも下位には出現しない)なので、
for toplevel in soup.find_all("TopClass"):
処理
で、一番大きなセグメント毎に処理を走らせることができる。このときtoplevelオブジェクトは
<class 'bs4.element.Tag'>
というタイプ。このタイプであれば、子要素、親要素、兄弟要素もろもろにアクセスできる便利なメソッドが使えるので、どんどん下位に向かってこれで欲しいデータが取り出せるかと思ったら、処理中に
AttributeError: 'NavigableString' object has no attribute 'Subclass'
とかいうエラーが出てうまく処理できない。あれこれやっていると、for文で処理するときに中身のない改行だけ、というものが混じって出てくることが原因のよう。これはオブジェクトとして
<class 'bs4.element.NavigableString'>
となるようなのだけれど、これには便利なメソッドがほとんど使えない。なので調べると、最初のsoupから改行を取り除けばよい、ということで、やり方は
[tag.extract() for tag in soup(string='\n')]
でよいようだ。そのまま引き写しで実は文法的にもよく分からないのだけれど、これでforの中のforでどんどん下位にいっても全てTagオブジェクトなので目的の処理をすることができた。