Как написать атрибуты элементов с пространством имен с помощью LXML?
Я использую 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 выбрасывает a ValueError: Invalid attribute name u'xmlns:dc'
Я использовал XML и lxml в прошлом для простых вещей, но мне все равно удалось ничего не знать о пространствах имен.
Ответы
Ответ 1
В отличие от 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
и SubElement
:
n = SubElement(root, "{%s}foo" % (DCNS))
Ответ 2
Используя 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"/>