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
要素の属性で名前空間を収集し、一般的に優れた名前空間サポートを備えています。