इनपुट नाम में नामस्थान जोड़ें मैं बाहरी program द्वारा उत्पन्न एक XML फ़ाइल को पार्स कर रहा हूं। मैं अपने नामस्थान का उपयोग करके, इस फ़ाइल में कस्टम एनोटेशन जोड़ना चाहूंगा। मेरे इनपुट लग रहा है नीचे के रूप में:lxml: फ़ाइल
<sbml xmlns="http://www.sbml.org/sbml/level2/version4" xmlns:celldesigner="http://www.sbml.org/2001/ns/celldesigner" level="2" version="4">
<model metaid="untitled" id="untitled">
<annotation>...</annotation>
<listOfUnitDefinitions>...</listOfUnitDefinitions>
<listOfCompartments>...</listOfCompartments>
<listOfSpecies>
<species metaid="s1" id="s1" name="GenA" compartment="default" initialAmount="0">
<annotation>
<celldesigner:extension>...</celldesigner:extension>
</annotation>
</species>
<species metaid="s2" id="s2" name="s2" compartment="default" initialAmount="0">
<annotation>
<celldesigner:extension>...</celldesigner:extension>
</annotation>
</species>
</listOfSpecies>
<listOfReactions>...</listOfReactions>
</model>
</sbml>
मुद्दा जा रहा है कि lxml केवल नामस्थान वाणी जब वे उपयोग किया जाता है, जिसका अर्थ है घोषणा को कई बार दोहराया जाता है, इसलिए (सरलीकृत) की तरह:
<sbml xmlns="namespace" xmlns:celldesigner="morenamespace" level="2" version="4">
<listOfSpecies>
<species>
<kjw:test xmlns:kjw="http://this.is.some/custom_namespace"/>
<celldesigner:data>Some important data which must be kept</celldesigner:data>
</species>
<species>
<kjw:test xmlns:kjw="http://this.is.some/custom_namespace"/>
</species>
....
</listOfSpecies>
</sbml>
यह है 0xया listOfSpecies
जैसे माता-पिता तत्व में केवल एक बार इस घोषणा को लिखने के लिए lxml को मजबूर करना संभव है? या ऐसा करने का कोई अच्छा कारण नहीं है? परिणाम मैं चाहता हूँ होगा:
<sbml xmlns="namespace" xmlns:celldesigner="morenamespace" level="2" version="4" xmlns:kjw="http://this.is.some/custom_namespace">
<listOfSpecies>
<species>
<kjw:test/>
<celldesigner:data>Some important data which must be kept</celldesigner:data>
</species>
<species>
<kjw:test/>
</species>
....
</listOfSpecies>
</sbml>
महत्वपूर्ण समस्या यह है कि जो एक फ़ाइल से पढ़ा जाता है मौजूदा डेटा रखा जाना चाहिए है, तो मैं बस (मुझे लगता है कि?) एक नया मूल तत्व नहीं कर सकता।
संपादित करें: नीचे कोड कोड।
def annotateSbml(sbml_input):
from lxml import etree
checkSbml(sbml_input) # Makes sure the input is valid sbml/xml.
ns = "http://this.is.some/custom_namespace"
etree.register_namespace('kjw', ns)
sbml_doc = etree.ElementTree()
root = sbml_doc.parse(sbml_input, etree.XMLParser(remove_blank_text=True))
nsmap = root.nsmap
nsmap['sbml'] = nsmap[None] # Makes code more readable, but seems ugly. Any alternatives to this?
nsmap['kjw'] = ns
ns = '{' + ns + '}'
sbmlns = '{' + nsmap['sbml'] + '}'
for species in root.findall('sbml:model/sbml:listOfSpecies/sbml:species', nsmap):
species.append(etree.Element(ns + 'test'))
sbml_doc.write("test.sbml.xml", pretty_print=True, xml_declaration=True)
return
अपने कोड दिखाएं। – Marcin
@ मार्सिन: किया गया। कोई सुझाव? – kai
@mzjin मेरे इनपुट में ' 'टैग को छोड़कर सबकुछ शामिल है। इसका उद्देश्य इस सूची में प्रत्येक प्रजाति के लिए ऐसे टैग (या समान, उदा। 'Kjw: score' या 'kjw: length') डालना है। क्या यह समझ में आता है, या मुझे पूरी फाइल पोस्ट करनी चाहिए (मुझे लगता है कि मेरा मूल प्रश्न काफी लंबा था)? –
kai