使用lxml编写xml:id属性

时间:2017-10-10 18:06:02

标签: python xml lxml w3c

我尝试使用lxml重建TEI-XML文件。

我的文件的开头是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-model href="https://www.ssrq-sds-fds.ch/tei/TEI_Schema_SSRQ.rng" 
            type="application/xml" 
            schematypens="http://relaxng.org/ns/structure/1.0"?>
<?xml-model href="https://www.ssrq-sds-fds.ch/tei/TEI_Schema_SSRQ.rng" 
            type="application/xml" 
            schematypens="http://purl.oclc.org/dsdl/schematron"?>
<?xml-stylesheet type="text/css" 
                 href="https://www.ssrq-sds-fds.ch/tei/Textkritik_Version_tei-ssrq.css"?>

<TEI xmlns:xi="http://www.w3.org/2001/XInclude" 
     xmlns="http://www.tei-c.org/ns/1.0" n="" 
     xml:id="[To be generated]" <!-- e.g. StAAG_U-17_0007a --> >

在我看来,前四行不应该太重要,但我将它们包括在内是为了完整性。我的问题始于TEI-Element。 所以我复制它的代码如下所示:

NSMAP = {"xml":"http://www.tei-c.org/ns/1.0",
         "xi":"http://www.w3.org/2001/XInclude"}
root = et.Element('TEI', n="", nsmap=NSMAP)
root.attrib["id"] = xml_id
root.attrib["xmlns"] = "http://www.tei-c.org/ns/1.0"

字符串xml_id之前已分配,对我的问题无关紧要。所以我的代码告诉我这一行:

<TEI xmlns:xi="http://www.w3.org/2001/XInclude"
     n=""
     id="StAAG_U-17_0006"
     xmlns="http://www.tei-c.org/ns/1.0">

所以唯一缺少的就是这个xml:id属性。我找到了这个规范页面:https://www.w3.org/TR/xml-id/我知道它在FAQ的lxml中被提及了。

顺便说一下,root.attrib["xml:id"]不起作用,因为它不是一个可行的属性名称。

那么,有没有人知道如何将我的ID分配给一个元素xml:id属性?

1 个答案:

答案 0 :(得分:2)

您需要指定id是默认xml命名空间的一部分。试试这个:

root.attrib["{http://www.w3.org/XML/1998/namespace}id"] = xml_id

参考:https://www.w3.org/TR/xml-names/#ns-decl