我想使用Python的ElementTree解析以下XML:
<;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”>;篮球联赛</rdfs:标签>;
<;rdfs:comment-xml:lang=“en”>;
互相竞争的一组运动队
打篮球
</rdfs:评论>;
</猫头鹰:类>;
</rdf:rdf>;
我想找到所有owl:Class标记,然后提取其中所有rdfs:label实例的值。我正在使用以下代码:
tree=ET.parse(“文件名”)
root=tree.getroot()
root.findall('owl:Class')
由于名称空间的原因,我得到以下错误
语法错误:在前缀映射中找不到前缀“owl”
我试着在家里读文件http://effbot.org/zone/element-namespaces.htm 但是我仍然无法实现这一点,因为上面的XML有多个嵌套的名称空间
请告诉我如何更改代码以查找所有的owl:Class标记
您需要为.find()、findall()和iterfind()方法提供一个显式的命名空间字典:
名称空间={'owl':'http://www.w3.org/2002/07/owl#'}#根据需要添加更多
findall('owl:Class',名称空间)
前缀仅在传入的名称空间参数中查找。这意味着您可以使用任何您喜欢的名称空间前缀;API分离了owl:部分,在namespaces字典中查找相应的名称空间URL,然后更改搜索以查找XPath表达式{http://www.w3.org/2002/07/owl}类。当然,您也可以自己使用相同的语法:
root.findall('{http://www.w3.org/2002/07/owl#}类')
另请参见ElementTree文档的使用名称空间解析XML部分
如果你能切换到lxml库,事情会更好;该库支持相同的ElementTree API,但在元素的.nsmap属性中为您收集名称空间,并且通常具有更好的名称空间支持