18

我正在使用 lxml (2.2.8) 创建和写出一些 XML(特别是 XGMML)。将要阅读它的应用程序显然相当繁琐,并且希望看到一个顶级元素:

<graph label="Test" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="h
ttp://www.w3.org/1999/xlink" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-
ns#" xmlns:cy="http://www.cytoscape.org" xmlns="http://www.cs.rpi.edu/XGMML"  di
rected="1">

如何xmlns:使用 lxml 设置这些属性?如果我尝试明显

root.attrib['xmlns:dc']='http://purl.org/dc/elements/1.1/'
root.attrib['xmlns:xlink']='http://www.w3.org/1999/xlink'
root.attrib['xmlns:rdf']='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
root.attrib['xmlns:cy']='http://www.cytoscape.org'
root.attrib['xmlns']='http://www.cs.rpi.edu/XGMML'

lxml 抛出一个ValueError: Invalid attribute name u'xmlns:dc'

过去,我曾大量使用 XML 和 lxml 来处理简单的事情,但到目前为止,我设法避免需要了解有关名称空间的任何信息。

4

2 回答 2

26

与允许这样做的 ElementTree 或其他序列化程序不同,lxml您需要事先设置这些命名空间:

NSMAP = {"dc" : 'http://purl.org/dc/elements/1.1',
         "xlink" : 'http://www.w3.org/1999/xlink'}

root = Element("graph", nsmap = NSMAP)

(对于其余的声明,依此类推)

然后你可以使用它们正确的声明来使用命名空间:

n = SubElement(root, "{http://purl.org/dc/elements/1.1}foo")

当然,这会让输入变得烦人,因此将路径分配给短常量名称通常是有益的:

DCNS = "http://purl.org/dc/elements/1.1"

NSMAP然后在 the和声明中使用该变量SubElement

n = SubElement(root, "{%s}foo" % (DCNS))
于 2011-10-09T11:21:42.087 回答
6

使用ElementMaker

import lxml.etree as ET
import lxml.builder as builder
E = builder.ElementMaker(namespace='http://www.cs.rpi.edu/XGMML',
                         nsmap={None: 'http://www.cs.rpi.edu/XGMML',
                         'dc': 'http://purl.org/dc/elements/1.1/',
                         'xlink': 'http://www.w3.org/1999/xlink',
                         'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
                         'cy': 'http://www.cytoscape.org', })
graph = E.graph(label="Test", directed="1")
print(ET.tostring(graph, pretty_print=True))

产量

<graph xmlns:cy="http://www.cytoscape.org" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.cs.rpi.edu/XGMML" directed="1" label="Test"/>
于 2011-10-09T11:37:21.270 回答