1. ホーム
  2. python

[解決済み] Pythonで「ElementTree」による名前空間付きXMLのパース

2022-04-21 18:44:26

質問

次のようなXMLがあり、それをPythonの ElementTree :

<rdf:RDF xml:base="http://dbpedia.org/ontology/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns="http://dbpedia.org/ontology/">

    <owl:Class rdf:about="http://dbpedia.org/ontology/BasketballLeague">
        <rdfs:label xml:lang="en">basketball league</rdfs:label>
        <rdfs:comment xml:lang="en">
          a group of sports teams that compete against each other
          in Basketball
        </rdfs:comment>
    </owl:Class>

</rdf:RDF>

をすべて見つけたい。 owl:Class タグの値を抽出し、すべての rdfs:label のインスタンスを作成します。私は以下のコードを使っています。

tree = ET.parse("filename")
root = tree.getroot()
root.findall('owl:Class')

名前空間があるため、以下のようなエラーが発生します。

SyntaxError: prefix 'owl' not found in prefix map

のドキュメントを読んでみました。 http://effbot.org/zone/element-namespaces.htm が、上記のXMLには複数の名前空間がネストされているため、まだ動作させることができません。

をすべて見つけるには、どのようにコードを変更すればよいか教えてください。 owl:Class タグを使用します。

解決方法は?

を与える必要があります。 .find() , findall()iterfind() メソッドを明示的な名前空間辞書として使用します。

namespaces = {'owl': 'http://www.w3.org/2002/07/owl#'} # add more as needed

root.findall('owl:Class', namespaces)

プリフィクスは のみ で調べます。 namespaces パラメータを渡します。つまり、好きな名前空間プレフィックスを使うことができます。 owl: の部分で対応する名前空間の URL を調べます。 namespaces ディクショナリを検索し、XPath 式 {http://www.w3.org/2002/07/owl}Class の代わりに もちろん、あなた自身も同じ構文を使うことができます。

root.findall('{http://www.w3.org/2002/07/owl#}Class')

また 名前空間を利用したXMLのパース セクション を、ElementTree ドキュメントに追加しました。

に切り替えられると lxml ライブラリ このライブラリは同じ ElementTree API をサポートしていますが、 名前空間を収集するために .nsmap 属性があり、一般的に優れた名前空間のサポートがあります。