我尝试创建一个这样的 XML 文件:
<pico:record xsi:schemaLocation="http://purl.org/pico/1.0/ http://www.culturaitalia.it/pico/schemas/1.0/pico.xsd>
<dc:identifier>work_3117</dc:identifier>
</pico:record>
我使用这段代码:
from lxml import etree
xsi="http://www.w3.org/2001/XMLSchema-instance"
schemaLocation="http://purl.org/pico/1.0/ http://www.culturaitalia.it/pico/schemas/1.0/pico.xsd"
ns = "{xsi}"
root=etree.Element("pico:record", attrib={"{" + xsi + "}schemaLocation" : schemaLocation})
etree.SubElement(root, "dc:identifier").text = "work_3117"
print(etree.tostring(root, pretty_print=True))
结果不工作,python 告诉我:
ValueError:无效的标签名称 u'pico:record'
如果我将“pico:recors”更改为“record”,则错误为:
ValueError:无效的标签名称 u'dc:identifier'
最佳答案
好吧,这个问题有点老了,但我今天遇到了同样的问题。
您需要为生成提供“dc”命名空间,“pico”也是如此。而且你必须让 lxml 知道这个命名空间。您可以使用在创建根元素时提供的 namespace 映射来执行此操作:
from lxml import etree
xsi="http://www.w3.org/2001/XMLSchema-instance"
schemaLocation="http://purl.org/pico/1.0/ http://www.culturaitalia.it/pico/schemas/1.0/pico.xsd"
pico = "http://purl.org/pico/1.0/"
dc = "http://purl.org/dc/elements/1.1/"
ns = {"xsi": xsi, "dc": dc, "pico": schemalocation}
root=etree.Element("{" + pico + "}record", attrib={"{" + xsi + "}schemaLocation" : schemaLocation}, nsmap=ns)
etree.SubElement(root, "{" + dc + "}" + "identifier").text = "work_3117"
print etree.tostring(root, pretty_print=True)
结果是:
<pico:record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pico="http://purl.org/pico/1.0/" xsi:schemaLocation="http://purl.org/pico/1.0/ http://www.culturaitalia.it/pico/schemas/1.0/pico.xsd">
<dc:identifier>work_3117</dc:identifier>
</pico:record>
有关详细信息,请参阅:http://lxml.de/tutorial.html#namespaces
关于python - 创建带有前缀标签的 XML 文件(python 和 lxml),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16637908/