Python3解析XML檔案並存入Excel表中
阿新 • • 發佈:2018-12-31
1. XML檔案部分資料如下:
<?xml version='1.0' encoding='UTF-8'?> <nvd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://nvd.nist.gov/feeds/cve/1.2" nvd_xml_version="1.2" pub_date="2017-05-12" xsi:schemaLocation="http://nvd.nist.gov/feeds/cve/1.2 https://scap.nist.gov/schema/nvd/nvd-cve-feed_1.2.1.xsd"> <entry type="CVE" name="CVE-1999-0001" seq="1999-0001" published="1999-12-30" modified="2010-12-16" severity="Medium" CVSS_version="2.0" CVSS_score="5.0" CVSS_base_score="5.0" CVSS_impact_subscore="2.9" CVSS_exploit_subscore="10.0" CVSS_vector="(AV:N/AC:L/Au:N/C:N/I:N/A:P)"> <desc> <descript source="cve">ip_input.c in BSD-derived TCP/IP implementations allows remote attackers to cause a denial of service (crash or hang) via crafted packets.</descript> </desc> <loss_types> <avail/> </loss_types> <range> <network/> </range> <refs> <ref source="CONFIRM" url="http://www.openbsd.org/errata23.html#tcpfix">http://www.openbsd.org/errata23.html#tcpfix</ref> </refs> <vuln_soft> <prod name="freebsd" vendor="freebsd"> <vers num="1.1.5.1"/> <vers num="2.2.8"/> <vers num="2.2"/> <vers num="1.0"/> <vers num="2.1.7"/> <vers num="2.2.6"/> <vers num="2.1.6.1"/> <vers num="3.0"/> <vers num="2.0"/> <vers num="2.1.7.1"/> <vers num="1.1"/> <vers num="2.2.2"/> <vers num="1.2"/> <vers num="2.0.5"/> <vers num="2.2.3"/> <vers num="2.0.1"/> <vers num="2.1.5"/> <vers num="2.2.4"/> <vers num="2.1.6"/> <vers num="2.2.5"/> </prod> <prod name="bsd_os" vendor="bsdi"> <vers num="3.1"/> </prod> <prod name="openbsd" vendor="openbsd"> <vers num="2.4"/> <vers num="2.3"/> </prod> </vuln_soft> </entry>
2. Python3解析XML並將資料寫入Excel表中
# -*- coding: utf-8 -*- import xml.dom.minidom #匯入處理xml檔案的模組 import pandas as pd #開啟xml文件 並將這個檔案物件存入dom變數 dom = xml.dom.minidom.parse('dataset_source/NVD/nvdcve-2002.xml') #得到文件元素物件 root = dom.documentElement #用於得到dom物件的文件元素,並把獲得的物件給root #獲得標籤為entry的多組標籤 entry_tag=dom.getElementsByTagName('entry') data1=entry_tag[0] #表示多組標籤中的第一個,entry_tag[2]表示這多組標籤中的第三個 cve_name=data1.getAttribute("name") #獲得元素屬性對應的值 print(cve_name) lenth=entry_tag.length #獲取xml檔案中標籤對為entry的個數 print(len(entry_tag)) #獲取xml檔案中標籤對為entry的個數 print(lenth) descript_tag=dom.getElementsByTagName('descript') #獲得標籤為entry的多組標籤 data2=descript_tag[0] descript=data2.firstChild.data #獲得標籤對之間的資料 print(descript) #獲取entry標籤的子標籤descript之間的資料 data3=dom.getElementsByTagName('entry')[0].getElementsByTagName('descript')[0].firstChild.data print(data3) cve_list=[] descript_list=[] cve_list.append(cve_name) #將獲得的資料存入列表 descript_list.append(descript) all_dict={'CVE':cve_list,'Decript':descript_list} #將列表儲存為字典 df = pd.DataFrame(all_dict) #將字典轉換為DataFrame #將DataFrame資料寫入excel表中 with pd.ExcelWriter('new.xls') as Writer: df.to_excel(Writer,'Sheet1',index=False)
結果為: