2011-10-09 5 views
10

मैं कुछ XML (विशेष रूप से XGMML) बनाने और लिखने के लिए lxml (2.2.8) का उपयोग कर रहा हूं। app जो इसे पढ़ने की जाएगी जाहिरा तौर पर काफी fussy है और के साथ एक उच्च स्तर घटक देखना चाहता है:एलएक्सएमएल के साथ नेमस्पेड तत्व विशेषताओं को कैसे लिखें?

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

मैं एक्सएमएल का इस्तेमाल किया और सरल सामान के लिए अतीत में पर्याप्त मात्रा में lxml है, लेकिन अब तक नामस्थान बारे में कुछ पता करने की जरूरत से बचने में कामयाब रहे।

उत्तर

18

ElementTree या अन्य serializers के विपरीत है कि इस अनुमति होगी, 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") 

बेशक इस टाइप करने के लिए कष्टप्रद हो जाता है, तो यह आम तौर पर beneficia है एल कम निरंतर नाम के लिए पथ निर्दिष्ट करने के लिए:

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

और फिर दोनों NSMAP और SubElement घोषणाओं में कि चर का उपयोग:

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

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"/> 
संबंधित मुद्दे