
Hallo Leute, kann mir jemand mit meinem xml-parser helfen, ich hab da einen Wurm drin, und weiss nicht wo er liegt. anbei ein test.xml file und der dazugehoerige dtd-file als erwuenschter output soll folgendes rauskommen:
HP001 Helicobacter_pylori MATRTQARGAVVELLYAFESGNEEIKKIASSMLEEKKIKNNQLAFALSLFNGVLEKINEIDALIEPHLKDWDFKR LGSMEKAILRLGAYEIGFTPTQNPIIINECIELGKLYAEPNTPKFLNAILDSLSKKLTQKPLN HP002 Helicobacter_pylori MQIIEGKLQLQGNERVAILTSRFNHIITDRLQEGAMDCFKRHGGDEDLLDIVLVPGAYELPFILDKLLESEKYDG VCVLGAIIRGGTPHFDYVSAEATKGIAHAMLKYSMPVSFGVLTTDNIEQAIERAGSKAGNKGFEAMSTLIELLSL CQTLKG HP003 Helicobacter_pylori MKTSKTKTPKSVLIAGPCVIESLENLRSIATKLQPLANNERLDFYFKASFDKANRTSLESYRGPGLEKGLEMLQT IKEEFGYKILTDVHESYQASVAAKVADILQIPAFLCRQTDLIVEVSQTNAIVNIKKGQFMNPKDMQYSVLKALKT RDKSIQSPTYETALKNGVWLCERGSSFGYGNLVVDMRSLKIMREFAPVIFDATHSVQMPGGANGKSSGDSSFAPI LARAAAAVGIDGLFAETHVDPKNALSDGANMLKPDELEQLVTDMLKIQNLF
Vielleicht kann mir da ja jemand ein wenig helfen. im Moment ist der output nur:
HP003 Helicobacter_pylori alle sequenzen.....
#!/usr/bin/python # xmlparserBFAB.py import sys import string from xml.sax import make_parser import bfabhandler saxparser = make_parser() handler = bfabhandler.BfabHandler() saxparser.setContentHandler(handler) saxparser.parse(sys.argv[1]) if handler.isMatch: print ">%s %s" % (handler.gname,handler.orgname) print handler.sequence #!/usr/bin/env python # bfabhandler.py from xml.sax.handler import ContentHandler def normalize_whitespace(text): "Remove redundant whitespace from a string" return ' '.join(text.split()) class BfabHandler(ContentHandler): """ Ein Handler fuer BFAB-Files """ inGene = 0 inSequence = 0 isMatch = 0 inOrg = 0 inData = 0 gname = "" sequence = "" def startElement(self, name, attrs): if name == "BENCHMARK_DATASET": self.inData = 1 elif self.inData: if name == "GENOME": self.orgname = normalize_whitespace(attrs.get("NAME","")) self.inOrg = 1 elif self.inOrg: if name == "GENE": self.gname = normalize_whitespace(attrs.get("NAME","")) self.inGene = 1 self.isMatch = 1 elif self.inGene: if name == "SEQUENCE": self.inSequence = 1 def characters(self,ch): if self.inSequence: self.sequence += ch def endElement(self, name): if name == "SEQUENCE": self.inSequence = 0 self.sequence=normalize_whitespace(self.sequence) -- Joerg Krebs <krebsj@cip.ifi.lmu.de> _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Joerg Krebs wrote:
kann mir jemand mit meinem xml-parser helfen, ich hab da einen Wurm drin, und weiss nicht wo er liegt. als erwuenschter output soll folgendes rauskommen: [mehrere gname/orgname/sequence-Tripel] im Moment ist der output nur: [ein gmane/orgname/sequence-Tripel, und zwar das letzte]
saxparser = make_parser() handler = bfabhandler.BfabHandler() saxparser.setContentHandler(handler) saxparser.parse(sys.argv[1])
if handler.isMatch: print ">%s %s" % (handler.gname,handler.orgname) print handler.sequence
Ich finde die Ausgabe nicht überraschend: Es gibt nur eine print-Anweisung, also kann auch nur ein Datensatz ausgegeben werden. Kern des Problems ist, dass .parse() *alle* Daten verarbeitet und dann zurückkehrt. Dh. jedesmal, wenn GENOME kommt, wird self.orgname überschrieben. Mein Lösungsvorschlag ist anbei. Ciao, Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Am Sonntag, den 12.02.2006, 20:17 +0100 schrieb "Martin v. Löwis":
Joerg Krebs wrote:
kann mir jemand mit meinem xml-parser helfen, ich hab da einen Wurm drin, und weiss nicht wo er liegt. als erwuenschter output soll folgendes rauskommen: [mehrere gname/orgname/sequence-Tripel] im Moment ist der output nur: [ein gmane/orgname/sequence-Tripel, und zwar das letzte]
saxparser = make_parser() handler = bfabhandler.BfabHandler() saxparser.setContentHandler(handler) saxparser.parse(sys.argv[1])
if handler.isMatch: print ">%s %s" % (handler.gname,handler.orgname) print handler.sequence
Ich finde die Ausgabe nicht überraschend: Es gibt nur eine print-Anweisung, also kann auch nur ein Datensatz ausgegeben werden.
Kern des Problems ist, dass .parse() *alle* Daten verarbeitet und dann zurückkehrt. Dh. jedesmal, wenn GENOME kommt, wird self.orgname überschrieben.
Mein Lösungsvorschlag ist anbei.
Ciao, Martin
Hallo Martin, vielen vielen Dank fuer die Hilfe. Allerdings, hab ich im Mom noch das Problem, dass die Sequencen nun alle zusammengehaengt werde (also, beim ersten identifier, den 1.sequenzteil, beim 2ten Identifier den 1. + 2. Sequenzteil... usw...) ich vermute, ich muss beim endtag von GENE den String von Sequence wieder auf "" setzen, oder ? mfg Joerg _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de

Joerg Krebs wrote:
ich vermute, ich muss beim endtag von GENE den String von Sequence wieder auf "" setzen, oder ?
Genau. Martin _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (2)
-
"Martin v. Löwis"
-
Joerg Krebs