Python で 'ElementTree' を使用して名前空間付き XML を解析する 質問する

Python で 'ElementTree' を使用して名前空間付き XML を解析する 質問する

Python を使用して解析したい次の XML があります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

ベストアンサー1

.find()findall()およびiterfind()メソッドに明示的な名前空間辞書を指定する必要があります。

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

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

接頭辞はのみnamespaces渡したパラメータで検索されます。つまり、任意の名前空間プレフィックスを使用できます。API は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要素の属性で名前空間を収集し、一般的に優れた名前空間サポートを備えています。

おすすめ記事