Страницы

Поиск по вопросам

вторник, 25 февраля 2020 г.

Как распарсить нетривиальный XML на питоне?

#python #xml #lxml



    
        
            
                
                    
                    
                        ${host}
                        ${port}
                    
                    
                
                
                    
                    
                        220
                    
                    220 localhost SMTP
Server (JAMES SMTP Server 2.3.2)(MSK)
                    
                
                
                    
                    
                        name
                    
                    
                
                
                    
                    
                        250
                    
                    250 localhost
Hello name (localhost [127.0.0.1])
                    
            
            Test "g_helo_with_C_OrJoin273_" in keyword-driven format.
            
            
        
        
            
                
                    
                    
                        ${host}
                        ${port}
                    
                    
                
                
                    
                    
                        220
                    
                    220 localhost SMTP Server
(JAMES SMTP Server 2.3.2) 14:50:18 +0400 (MSK)
                    
                
                
                    
                    
                        name
                    
                    
                
                
                    
                    
                        255
                    
                    250 localhost
Hello name (localhost [127.0.0.1])
                    
                
            
            Test "g_helo_with_C_OrJoin273_helo_resp_2_2_trace0001_L" in keyword-driven
format.
            
            
        
    
    



Как распарсить так, чтоб в выводе было: suite source и соответствующие ему kw name,
arguments, status?
Проблема в том, что я не знаю как выводить список suite source, а в нем еще список
kw name, arguments, status.
    


Ответы

Ответ 1



Вам поможет minidom: from xml.dom import minidom om = minidom.parseString(x) root = om.getElementsByTagName('robot')[0] # Далее что-то, к примеру: def walk(x, d=0): print(' ' * d + str(x)) if x.attributes is not None: for i, j in x.attributes.items(): print(' ' * d + ' | ' + i + ': ' + j) for i in x.childNodes: walk(i, d+1) walk(root)

Ответ 2



Для сравнения, код на основе xml.etree.ElementTree: #!/usr/bin/env python import xml.etree.ElementTree as etree robot = etree.parse('input.xml').getroot() for suite in robot.iter('suite'): print("suite " + suite.get('source')) for kw in suite.findall('./test/kw'): print("\tkw" + kw.get('name')) for arg in kw.find('arguments') or []: print("\t\targ " + arg.text) print("\t\t" + "\n\t\t".join(map("=".join, sorted(kw.find('status').items())))) Output suite /home/Robot suite /home/Join273_helo_resp_2_1_trace0001_L.txt kwSmtpLibrary.Connect To Smtp arg ${host} arg ${port} endtime=20150623 14:50:18.241 starttime=20150623 14:50:18.234 status=PASS kwSmtpLibrary.Check Response arg 220 endtime=20150623 14:50:18.257 starttime=20150623 14:50:18.241 status=PASS ... suite /home/_2_2_trace0001_L.txt kwSmtpLibrary.Connect To Smtp arg ${host} arg ${port} endtime=20150623 14:50:18.275 starttime=20150623 14:50:18.274 status=PASS kwSmtpLibrary.Check Response arg 220 endtime=14:50:18.277 starttime=20150623 14:50:18.275 status=PASS ...

Комментариев нет:

Отправить комментарий