2011-10-09 1 views
10

J'utilise lxml (2.2.8) pour créer et écrire du XML (spécifiquement XGMML). Le app qui sera en train de lire, il est apparemment assez fussy et veut voir un élément de niveau supérieur avec:Comment écrire des attributs d'élément namespaced avec LXML?

<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"> 

Comment puis-je configurer les attributs xmlns: avec lxml? Si je tente l'évidence

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 jette un ValueError: Invalid attribute name u'xmlns:dc'

Je l'ai utilisé XML et lxml une bonne quantité dans le passé pour des choses simples, mais a réussi à éviter d'avoir à connaître quoi que ce soit à propos de namespaces jusqu'à présent.

Répondre

18

Contrairement à ElementTree ou d'autres serializers qui permettrait cela, lxml vous a besoin de mettre en place ces espaces de noms à l'avance:

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

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

(et ainsi de suite et ainsi de suite pour le reste des déclarations)

Et vous pouvez utiliser les espaces de noms en utilisant leurs déclarations appropriées:

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

Bien sûr, cela devient ennuyeux à taper, il est donc généralement bénéficia l d'assigner les chemins aux noms courts constants:

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

Et puis utilisez cette variable dans les deux NSMAP et les SubElement déclarations:

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

En utilisant 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)) 

rendements

<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"/> 
Questions connexes