28. 構建xml文檔

有時,我們需要將其他格式數據轉換爲xml,例如把書籍信息csv文件轉換成xml:

books.csv:
    書名, 作者, 出版社, 價格
    精通scrapy網絡爬蟲, 劉碩, 清華大學出版社, 46.00
    ...
books.xml:
<Data>
    <Book>
        <書名>精通scrapy網絡爬蟲</書名>
        <作者>劉碩</作者>
        <出版社>清華大學出版社</出版社>
        <價格>46.00</價格>
    </Book>
    ...
<Data>

要求:將csv文件轉換成xml。

解決方案:

使用標準庫中的xml.etree.ElementTree類,構建ElementTree,然後調用write()方法寫入文件。


  • 對於xml.tree.ElementTree類:

ElementTree提供了兩個對象:ElementTreeElement

ElementTree:將整個xml轉化爲樹,對整個xml文檔進行操作(讀取,寫入,查找等)一般在ElementTree層面進行。

Element:代表樹上單個節點,對單個xml元素及其子元素進行操作,則是在Element層面進行。

  • 構建xml:
>>> import xml.etree.ElementTree as ET

>>> data = ET.Element('Data')

>>> book = ET.Element('Book')

>>> autor = ET.Element('作者')

>>> book.set('x', 'abc')                #設置屬性,與get對應

>>> autor.text = '劉碩'

>>> data.append(book)               #爲data設置子節點

>>> book.append(autor)              #爲book設置子節點

>>> ET.dump(data)
<Data><Book x="abc"><作者>劉碩</作者></Book></Data>

>>> et = ET.ElementTree(data)

>>> et
<xml.etree.ElementTree.ElementTree object at 0x7fe39ac381d0>

>>> et.write('test.xml', encoding='utf8')               #寫入文件
# cat test.xml 
<?xml version='1.0' encoding='utf8'?>
<Data><Book x="abc"><作者>劉碩</作者></Book></Data>

設置子節點還可以使用ET.SubElement()方法,例如book = ET.Element('Book') data.append(book)等價於book = ET.SubElement(data, 'Book')


  • 方案示例:

books.csv:

書名, 作者, 出版社, 價格
精通scrapy網絡爬蟲, 劉碩, 清華大學出版社, 46.00
算法導論, Charles E.Leiserson, 人民郵電出版社, 85.00
Python灰帽子, Justin Seitz, 電子工業出版社, 39.00
精通scrapy網絡爬蟲1, 劉碩, 清華大學出版社, 46.00
算法導論1, Charles E.Leiserson, 人民郵電出版社, 85.00
Python灰帽子1, Justin Seitz, 電子工業出版社, 39.00
精通scrapy網絡爬蟲2, 劉碩, 清華大學出版社, 46.00
算法導論2, Charles E.Leiserson, 人民郵電出版社, 85.00
Python灰帽子2, Justin Seitz, 電子工業出版社, 39.00
精通scrapy網絡爬蟲3, 劉碩, 清華大學出版社, 46.00
算法導論3, Charles E.Leiserson, 人民郵電出版社, 85.00
Python灰帽子3, Justin Seitz, 電子工業出版社, 39.00
import csv
from xml.etree.ElementTree import ElementTree, Element, SubElement

def csv_to_xml(csv_path, xml_path):
    with open(csv_path) as f:
        reader = csv.reader(f)
        headers = next(reader)

        root = Element('Data')
        root.text = '\n\t'
        root.tail = '\n'

        for row in reader:
            book = SubElement(root, 'Book')
            book.text = '\n\t\t'
            book.tail = '\n\t'

            for tag, text in zip(headers, row):
                e = SubElement(book, tag)
                e.text = text
                e.tail = '\n\t\t'
            e.tail = '\n\t'
        book.tail = '\n'

        ElementTree(root).write(xml_path, encoding='utf8')

csv_to_xml('books.csv', 'books.xml')

books.xml:

<?xml version='1.0' encoding='utf8'?>
<Data>
	<Book>
		<書名>精通scrapy網絡爬蟲</書名>
		<作者>劉碩</作者>
		<出版社>清華大學出版社</出版社>
		<價格>46.00</價格>
	</Book>
	<Book>
		<書名>算法導論</書名>
		<作者>Charles E.Leiserson</作者>
		<出版社>人民郵電出版社</出版社>
		<價格>85.00</價格>
	</Book>
	<Book>
		<書名>Python灰帽子</書名>
		<作者>Justin Seitz</作者>
		<出版社>電子工業出版社</出版社>
		<價格>39.00</價格>
	</Book>
	<Book>
		<書名>精通scrapy網絡爬蟲1</書名>
		<作者>劉碩</作者>
		<出版社>清華大學出版社</出版社>
		<價格>46.00</價格>
	</Book>
	<Book>
		<書名>算法導論1</書名>
		<作者>Charles E.Leiserson</作者>
		<出版社>人民郵電出版社</出版社>
		<價格>85.00</價格>
	</Book>
	<Book>
		<書名>Python灰帽子1</書名>
		<作者>Justin Seitz</作者>
		<出版社>電子工業出版社</出版社>
		<價格>39.00</價格>
	</Book>
	<Book>
		<書名>精通scrapy網絡爬蟲2</書名>
		<作者>劉碩</作者>
		<出版社>清華大學出版社</出版社>
		<價格>46.00</價格>
	</Book>
	<Book>
		<書名>算法導論2</書名>
		<作者>Charles E.Leiserson</作者>
		<出版社>人民郵電出版社</出版社>
		<價格>85.00</價格>
	</Book>
	<Book>
		<書名>Python灰帽子2</書名>
		<作者>Justin Seitz</作者>
		<出版社>電子工業出版社</出版社>
		<價格>39.00</價格>
	</Book>
	<Book>
		<書名>精通scrapy網絡爬蟲3</書名>
		<作者>劉碩</作者>
		<出版社>清華大學出版社</出版社>
		<價格>46.00</價格>
	</Book>
	<Book>
		<書名>算法導論3</書名>
		<作者>Charles E.Leiserson</作者>
		<出版社>人民郵電出版社</出版社>
		<價格>85.00</價格>
	</Book>
	<Book>
		<書名>Python灰帽子3</書名>
		<作者>Justin Seitz</作者>
		<出版社>電子工業出版社</出版社>
		<價格>39.00</價格>
	</Book>
</Data>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章