1. 程式人生 > >Python3解析XML檔案並存入Excel表中

Python3解析XML檔案並存入Excel表中

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)

結果為: