Analyse XML avec des espaces de noms en Python via 'ElementTree'
XML avec des espaces de noms peut être rencontré lorsque vous travaillez avec diverses sources de données. Un de ces cas est celui du travail avec des ontologies publiées en RDF, où l'utilisation d'espaces de noms est courante. Cela peut entraîner des problèmes lors de la tentative d'analyse d'un tel XML à l'aide de la bibliothèque ElementTree de Python.
Considérez le XML suivant :
<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>
Si vous tentez d'analyser ce XML à l'aide du code suivant :
tree = ET.parse("filename") root = tree.getroot() root.findall('owl:Class')
Vous rencontrerez l'erreur suivante en raison de la présence d'espaces de noms dans le XML :
SyntaxError: prefix 'owl' not found in prefix map
Pour résoudre ce problème d'espace de noms, vous devez fournir un dictionnaire d'espace de noms explicite aux méthodes .find(), .findall() et .iterfind() :
namespaces = {'owl': 'http://www.w3.org/2002/07/owl#'} # add more as needed root.findall('owl:Class', namespaces)
Ce dictionnaire d'espace de noms permettra à ElementTree de rechercher l'URL d'espace de noms correcte pour le préfixe 'owl:' et de résoudre le problème. problème.
Vous pouvez également utiliser la bibliothèque lxml, qui offre une prise en charge supérieure des espaces de noms et collecte automatiquement les espaces de noms dans l'attribut .nsmap sur les éléments.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!