簡體   English   中英

如何用LXML編寫命名空間元素屬性?

[英]How to write namespaced element attributes with 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">

如何使用lxml設置這些xmlns:屬性? 如果我嘗試明顯的

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來處理簡單的事情,但是到目前為止還是設法避免需要知道關於命名空間的任何事情。

與允許這樣的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"

然后在NSMAPSubElement聲明中使用該變量:

n = SubElement(root, "{%s}foo" % (DCNS))

使用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"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM