Die XML-Daten (file.xml) für den Status sehen wie folgt aus

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<Activity_Logs xsi:schemaLocation="http://www.cisco.com/PowerKEYDVB/Auditing 
DailyActivityLog.xsd" To="2018-04-01" From="2018-04-01" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.cisco.com/PowerKEYDVB/Auditing">
    <ActivityRecord>
       <time>2015-09-16T04:13:20Z</time>
       <oper>Create_Product</oper>
       <pkgEid>10</pkgEid>
       <pkgName>BBCWRL</pkgName>
       </ActivityRecord>
    <ActivityRecord>
       <time>2015-09-16T04:13:20Z</time>
       <oper>Create_Product</oper>
       <pkgEid>18</pkgEid>
       <pkgName>CNNINT</pkgName>
    </ActivityRecord>

Das Parsen und Konvertieren der oben genannten XML-Datei in CSV erfolgt mit dem folgenden Python-Code.

import csv
import xml.etree.cElementTree as ET


tree =  ET.parse('file.xml')
root = tree.getroot()


data_to_csv= open('output.csv','w')

list_head=[]

Csv_writer=csv.writer(data_to_csv)

count=0
for elements in root.findall('ActivityRecord'):
    List_node = []
    if count == 0 :

        time = elements.find('time').tag
        list_head.append(time)

        oper = elements.find('oper').tag
        list_head.append(oper)

        pkgEid = elements.find('pkgEid').tag
        list_head.append(pkgEid)


        pkgName = elements.find('pkgName').tag
        list_head.append(pkgName)

        Csv_writer.writerow(list_head)
        count = +1

    time = elements.find('time').text
    List_node.append(time)

    oper = elements.find('oper').text
    List_node.append(oper)

    pkgEid = elements.find('pkgEid').text
    List_node.append(pkgEid)

    pkgName = elements.find('pkgName').text
    List_node.append(pkgName)    

    Csv_writer.writerow(List_node)

data_to_csv.close()

Der von mir verwendete Code gibt mir keine Daten in CSV. Könnte mir jemand sagen, wo genau ich falsch liege?

2
Nipun khanna 18 Apr. 2018 im 14:32

4 Antworten

Beste Antwort

Ich habe den am besten geeigneten Weg gefunden, dies zu tun.
os importieren Pandas als pd importieren

from bs4 import BeautifulSoup as b
with open("file.xml", "r") as f: # opening xml file
 content = f.read()

soup = b(content, "lxml")
df1=pd.DataFrame()
for each_file in files_xlm: 
with open( each_file, "r") as f: # opening xml file
    content = f.read()
soup = b(content, "lxml")    

list1 = []
for values in soup.findAll("activityrecord"):  
    if values.find("time") is None:
        time = ""
    else:
        time = values.find("time").text        
    if values.find("oper") is None:
        oper = ""    
    else:
        oper = values.find("oper").text      
    if values.find("pkgeid") is None:
        pkgeid = ""    
    else:
        pkgeid = values.find("pkgeid").text     
    if values.find("pkgname") is None:
        pkgname = ""    
    else:
        pkgname = values.find("pkgname").text 
    if values.find("dhct") is None:
        dhct = ""    
    else:
        dhct = values.find("dhct").text   
    if values.find("sourceid") is None:
        sourceid = ""    
    else:
        sourceid = values.find("sourceid").text      

    list1.append(time+','+ oper+','+pkgeid+','+ pkgname+','+dhct+','+sourceid)
    df  = pd.DataFrame(list1)



df=df[0].str.split(',', expand=True)
df.columns = ['Time','Oper','PkgEid','PkgName','dhct','sourceid']
df.to_csv("new.csv",index=False)
-1
Nipun khanna 24 Apr. 2018 im 11:11

Analysieren Sie mit Pandas alle XML-Felder.

import xml.etree.ElementTree as ET
import pandas as pd

tree = ET.parse("file.xml")
root = tree.getroot()

get_range = lambda col: range(len(col))
l = [{r[i].tag:r[i].text for i in get_range(r)} for r in root]

df = pd.DataFrame.from_dict(l)
df.to_csv('file.csv')
2
Willian Vieira 24 Apr. 2018 im 18:35

Mit pandas und BeautifulSoup können Sie Ihre erwartete Ausgabe leicht erreichen:

#Code:

import pandas as pd
import itertools
from bs4 import BeautifulSoup as b
with open("file.xml", "r") as f: # opening xml file
    content = f.read()

soup = b(content, "lxml")
pkgeid =  [ values.text for values in soup.findAll("pkgeid")]
pkgname = [ values.text for values in soup.findAll("pkgname")]
time =  [ values.text for values in soup.findAll("time")]
oper =  [ values.text for values in soup.findAll("oper")]
# For python-3.x use `zip_longest` method
# For python-2.x use 'izip_longest method
data = [item for item in itertools.zip_longest(time, oper, pkgeid, pkgname)] 
df  = pd.DataFrame(data=data)
df.to_csv("sample.csv",index=False, header=None)

#output in `sample.csv` file will be as follows:
2015-09-16T04:13:20Z,Create_Product,10,BBCWRL
2015-09-16T04:13:20Z,Create_Product,18,CNNINT
2018-04-01T03:30:28Z,Deactivate_Dhct,,
1
Rachit kapadia 19 Apr. 2018 im 10:27

Verwenden Sie pyxmlparser, wenn es sich um eine einmalige Operation handelt.

Haftungsausschluss Ich bin der Autor der Bibliothek und sie ist ziemlich neu. Jedes Feedback wird geschätzt. Es ist ein Befehlszeilenprogramm.

https://pypi.org/project/pyxmlparser/

0
Vishnu Kiran 13 März 2019 im 23:48