8

我正在尝试使用类似于此示例的lxml指定名称空间(取自此处):

<TreeInventory xsi:noNamespaceSchemaLocation="Trees.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
</TreeInventory>

我不确定如何添加要使用的 Schema 实例以及 Schema 位置。通过执行以下操作,文档让我开始了:

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'
>>> TREE = '{%s}' % NS
>>> NSMAP = {None: NS}
>>> tree = etree.Element(TREE + 'TreeInventory', nsmap=NSMAP)
>>> etree.tostring(tree, pretty_print=True)
'<TreeInventory xmlns="http://www.w3.org/2001/XMLSchema-instance"/>\n'

我不确定如何将其指定为实例,然后还指定位置。似乎这可以使用nsmap关键字参数 in来完成etree.Element,但我不明白如何。

4

1 回答 1

10

为了清楚起见,在更多步骤中:

>>> NS = 'http://www.w3.org/2001/XMLSchema-instance'

据我所知,它是noNamespaceSchemaLocation您想要命名空间的属性,而不是TreeInventory元素。所以:

>>> location_attribute = '{%s}noNamespaceSchemaLocation' % NS    # f-string doesn't work in this case
>>> elem = etree.Element('TreeInventory', attrib={location_attribute: 'Trees.xsd'})
>>> etree.tostring(elem, pretty_print=True)
'<TreeInventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Trees.xsd"/>\n'

这看起来像你想要的......你当然也可以先创建元素,没有属性,然后设置属性,如下所示:

>>> elem = etree.Element('TreeInventory')
>>> elem.set(location_attribute, 'Trees.xsd')

至于nsmap参数:我相信它只是用来定义在序列化时使用哪些前缀。在这种情况下,不需要它,因为 lxml 知道所讨论的命名空间的常用前缀是“xsi”。如果它不是某个众所周知的命名空间,您可能会看到诸如“ns0”、“ns1”等前缀,除非您指定了您喜欢的前缀。(记住:前缀不应该重要)

于 2009-05-14T14:59:28.333 回答