Toon posts:

[Python/XML] Naam-Waarde uitlezen

Pagina: 1
Acties:
  • 100 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik ben bezig met een programma dat informatie over FTP-servers bijhoud in XML-files. Informatie over alle servers wordt bijelkaar gezet in 1 bestand "serverlist.xml" dat er als volgt uitziet:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<serverlist>
    <server name="MyServer">
        <ip>127.0.0.1</ip>
        <port>21</port>
        <user>anonymous</user>
        <pass>ftp@lister.net</pass>
        <files>mp3|xvid|pr0n</files>
        <data>10240291</data>
        <online>1</online>
        <last_online>2005-2-26-17-22</last_online>
    </server>
    <server name="Your Server">
        <ip>62.251.0.1</ip>
        <port>6002</port>
        <user>down</user>
        <pass>l33cher</pass>
        <files>aac|xvid|games</files>
        <data>0</data>
        <online>0</online>
        <last_online>2005-1-2-10-00</last_online>
    </server>
</serverlist>

Nu wil ik dit bestand met python parsen zodat er geneste tuple komt die er als volgt uitziet:
Python:
1
2
3
4
serverlist = ( 
     ("MyServer", "127.0.0.1", "21", "anonymous", "ftp@lister.net", "mp3|xvid|pr0n", "10240291", "1", "2005-2-26-17-22"), 
     ("Your Server", etc...etc..)
)

Ik wil dit zo simpel mogelijk doen maar ik zie door de bomen het bos niet meer. Al die verschillende parsers, modules en methodes maken me ietwat in de war :)

Weet iemand een simpele methode om dit te parsen, evt door het gebruik van wat anders dan XML?

Verwijderd

Er zijn een inderdaad heleboeld modules voor Python/XML. Tools die het gebruik van XML vergemakkelijken, zijn o.a.: Amara en (c)elementtree, hoewel ik eerder gezegd betwijfel of deze dingen handiger zijn dan gewoon expat gebruiken (zie xml.parsers.expat). Een heleboel packages kun je trouwens vinden via http://python.org/pypi?%3...&keywords=&_pypi_hidden=0

Samengevat: er zijn een heleboel packages die XML & Python makkelijker maken, maar in dit zeer simpele geval zou ik expat gebruiken (normaal gesproken heb ik er een gloedhekel aan).

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 13-05 15:57

Robtimus

me Robtimus no like you

http://docs.python.org/lib/lib.html
Dan vooral de secties xml.dom en xml.dom.minidom.

stukje voorbeeld code dat voor mij werkt:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import xml.dom, xml.dom.minidom

try:
    doc = xml.dom.minidom.parse(file)
    for child in doc.documentElement.childNodes:
        if child.nodeType == child.ELEMENT_NODE:
            if child.tagName == "item":
                ' do something
                pass
            elif child.tagName == "menu":
                ' do something else
                pass
except xml.sax._exceptions.SAXParseException:
    sys.stderr.write("Syntax error in '%s'.\n" % location)
    return None
except IOError:
    sys.stderr.write("Error: could not read '%s'.\n" % location)
    return None

[ Voor 7% gewijzigd door Robtimus op 26-02-2005 19:16 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Ok dank jullie voor jullie tips en aanwijzingen, na veel zoekwerk en een niet gering aantal grijze haren ;) heb ik nu een kleine class geschreven die ServerXML bestanden parsed zoals ik dit wil. Mensen die graag schone code zien kunnen beter niet verder kijken want het is nog drama (binnenkort maar eens wat schonen :)

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import xml.dom.minidom

class ParseServerXML:

    def __init__(self,serverlist):
        servers = serverlist.getElementsByTagName("server")
        self.handleServers(servers)
        
    def getText(self,nodelist):
        rc = ""
        for node in nodelist:
            if node.nodeType == node.TEXT_NODE:
                rc = rc + node.data
        return rc

    def handleServers(self,servers):
        serverlist = list()
        for server in servers:
            x = self.handleServername(server)
            y = self.handleServer(server)
            for z in y:
                x.append(z)
            serverlist.append(x)
        self.serverlist = serverlist
    
    def handleServer(self,server):
        serverinfo = list()
        serverinfocats = ['ip', 'port', 'user', 'pass', 'files', 'data', 'online', 'last_online']
        for cat in serverinfocats:
            x = server.getElementsByTagName(cat)[0]
            serverinfo.append(self.getText(x.childNodes))
        return serverinfo
    
    def handleServername(self,title):
        for (name, value) in title.attributes.items():
                return [value]

serverlist = xml.dom.minidom.parse("serverlist.xml")
ServerXML = ParseServerXML(serverlist)
print ServerXML.serverlist