在pythonlxm中设置和访问名称空间

2024-05-15 14:01:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,用python3和lxml处理rdf:skos文件:

我了解到我需要将XML提到的名称空间传递给findall过程。(好吧,奇怪的是,由于XML文件在头中列出了这些,所以这似乎是一个不必要的步骤,但无论如何)。在

打电话时

for concept in root.findall('.//skos:Concept', namespaces=root.nsmap):

这很有效,因为根.nsmap由lxml构造。在

但是在后面的代码中,我还需要对xml:lang执行一个测试

^{pr2}$

Python告诉我

^{3}$

好吧,没错,在我的skos文件中,没有额外的xml名称空间声明。所以我试着把它加到根.nsmap迪克特

root.nsmap['xml'] = "http://www.w3.org/XML/1998/namespace"

但那也不管用

nsmap = {'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'uneskos': 'http://purl.org/umu/uneskos#', 'iso-thes': 'http://purl.org/iso25964/skos-thes#', 'dcterms': 'http://purl.org/dc/terms/', 'skos': 'http://www.w3.org/2004/02/skos/core#', 'rdfs': 'http://www.w3.org/2000/01/rdf-schema#'}

似乎不允许我修改root.nsmap?在

有人知道怎么做吗?我过去用perlxml::Twig处理过大量的XML,这是非常舒服的,我认为Python社区(至少)也有类似的舒适方法来完成这项工作。。。但是怎么做呢?在

谢谢你的任何暗示。在


Tags: 文件org名称httpwww空间rdfroot
1条回答
网友
1楼 · 发布于 2024-05-15 14:01:27

修改^{}没有效果。但是你可以创建另一个字典并修改它。示例:

from lxml import etree

doc = """
<root xmlns:skos="http://www.w3.org/2004/02/skos/core#">
   <skos:prefLabel xml:lang='en'>FOO</skos:prefLabel>
   <skos:prefLabel xml:lang='de'>BAR</skos:prefLabel>
</root>"""

root = etree.fromstring(doc)
nsmap = root.nsmap
nsmap["xml"] = "http://www.w3.org/XML/1998/namespace" 

en = root.find(".//skos:prefLabel[@xml:lang='en']", namespaces=nsmap)
print(en.text)

输出:

^{pr2}$

相关问题 更多 >