แปลก xml (cn140 in python)

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

พี่กี้บอก sax ก็ sax (จริงๆแล้วใช้ dom ไม่เป็นด้วย :-P)

import sys
from xml.sax import make_parser
from xml.sax.handler import ContentHandler
from xml.sax.saxutils import quoteattr
 
class MyHandler(ContentHandler):
    def __init__(self):
        ContentHandler.__init__(self)
 
    def startDocument(self):
        print "<node>"
        self.level = 0
        self.prev = None
 
    def endDocument(self):
        if self.prev != None:
            print self.prev + "/>"
        for i in range(self.level):
            print "</node>"
        print "</node>"
 
    def startElement(self, name, attrs):
        if len(attrs) > 0:
            level = int(attrs["level"])
            if level <= self.level:
                if self.prev != None:
                    print self.prev + "/>"
                for i in range(self.level - level):
                    print "</node>"
            else:
                if self.prev != None:
                    print self.prev + ">"
                if level > self.level + 1:
                    for i in range(level - self.level - 1):
                        print "<node>"
            self.prev = "<node" + \
                " type=" + quoteattr(attrs['type']) + \
                " name=" + quoteattr(attrs['name']) 
            self.level = level
 
def main():
    parser = make_parser()
    handler = MyHandler()
    parser.setContentHandler(handler)
    parser.parse(sys.argv[1])
 
if __name__ == '__main__':
    main()

เขียนแล้วไม่ค่อยมั่นใจเลยว่าจะถูก

sugree's picture

เสือปืนไว

from xml.sax import handler,make_parser
from xml.sax.writer import PrettyPrinter
 
class NodeTranslator(handler.ContentHandler):
    def __init__(self,writer):
        self.writer = writer
        self._level = -1
 
    def closeElement(self,name,level):
        while level <= self._level:
            self.writer.endElement(name)
            self._level -= 1
 
    def startElement(self,name,attrs):
        level = int(attrs.get('level',-1))
        outattrs = dict(filter(lambda x: x[0] != 'level',attrs.items()))
 
        if level > -1:
            self.closeElement(name,level)
        if level > self._level:
            self.writer.startElement(name,outattrs)
            self._level += 1
        elif level == self._level:
            self.writer.startElement(name,outattrs)
 
    def endDocument(self):
        self.closeElement('node',-1)
 
def translate(fi,fo):
    writer = PrettyPrinter(fo,endtagindentation=0)
    writer._packing = 0
    handler = NodeTranslator(writer)
    parser = make_parser()
    parser.setContentHandler(handler)
    parser.parse(fi)
 
if __name__ == '__main__':
    import sys
    translate(sys.argv[1],sys.stdout)

เหมือนคิดผิดที่ใช้ SAX รู้สึกถึงความไม่งาม

ขอนอกเรื่องนิดนึง...
ถ้า Coding ด้วย Python ผมนึกไม่ออกเลยว่าทำไมควรจะใช้ XML
เรื่องของเรื่องคือรู้สึกว่าใช้ Dict น่าจะสะดวกกว่า
หรือ Dict มันจะสะดวกก็ต่อเมื่อ ข้่อมูลไม่ซับซ้อนมากเท่านั้นหรือปล่าวก็ไม่รู้นะ?
แต่ถ้าอะไรที่มันซับซ้อนในแบบที่ใช้ Dict แล้วไม่เหมาะ
ก็ไปใช้พวก DB เลยไม่ดีกว่าเหรอ?
หรือถ้าขี้เกียจคิดเรื่องการลง DB Engine อย่างตระกูล SQL
ก็ใช้ ZODB ไม่ก็ Durus ก็น่าจะได้ คล้ายๆ กัน

--*--
ในกรณีที่ต้อง Interface กับภาษาอื่น ใช้ JSON ก็น่าจะดีหรือปล่าว?
รู้สึกว่ามัน Match กับ Dict ของ Python ดี

sugree's picture

คำถามคือคำตอบ

ถ้าโจทย์ไม่ได้ให้ xml มาแปลงเป็น xml ผมก็ไม่คิดจะใช้ xml ให้มึนหรอกครับ ส่วนใหญ่ถ้าใช้เองข้างในโปรแกรมส่วนตัวก็ไม่จำเป็นต้อง xml แต่เวลาคุยกับคนอื่น เค้าอยากได้ xml ก็ต้องหาให้เค้า

ผมทำงานกับพวก legacy system อยู่ พบว่ามันมีหลายๆ งานที่ใช้ XML ก็มีข้อดีอยู่เยอะครับ ประเด็นที่สำคัญมากๆ คือคนรองรับมันเยอะมาก และไม่น่าจะหายไปได้ง่ายๆ ในเร็วๆ นี้

JSON ก็มีจุดที่เหมาะสมกับมัน อย่างเช่นพวก AJAX นี่จะใช้กันเยอะ แต่ถ้าถามว่าพวก DB ทั้งหลายรองรับ JSON ไหมก็หายากอยู่ดี

veer's picture

ผมใช้เพราะ SAX นี่หละครับใช้ memory น้อยดี ไม่รู้ว่า library ของ Python ที่อ่่าน JSON มาทำ แบบ SAX หรือเปล่า? ถ้ามีจะได้ลองมาใช้บ้าง :-)

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น