文檔對象模型
xml.dom 模塊對于 Python 程序員來說,可能是使用 XML 文檔時(shí)功能最強(qiáng)大的工具。不幸的是,XML-SIG 提供的文檔目前來說還比較少。W3C 語言無關(guān)的 DOM 規(guī)范填補(bǔ)了這方面的部分空白。但 Python 程序員最好有一個(gè)特定于 Python 語言的 DOM 的快速入門指南。本文旨在提供這樣一個(gè)指南。在 上一篇專欄文章 中,某些樣本中使用了樣本 quotations.dtd 文件,并且這些文件可以與本文中的代碼樣本檔案文件一起使用。
有必要了解 DOM 的確切含義。這方面,正式解釋非常好:
“文檔對象模型”是平臺無關(guān)和語言無關(guān)的接口,它允許程序和腳本動態(tài)訪問和更新文檔的內(nèi)容、結(jié)構(gòu)和樣式。可以進(jìn)一步處理文檔,而處理的結(jié)果也可以合并到已顯示的頁面中。(萬維網(wǎng)聯(lián)盟 DOM 工作組)
DOM 將 XML 文檔轉(zhuǎn)換成樹 -- 或森林 -- 表示。萬維網(wǎng)聯(lián)盟 (W3C) 規(guī)范給出了一個(gè) HTML 表的 DOM 版本作為例子。
如上圖所示,DOM 從一個(gè)更加抽象的角度定義了一組可以遍歷、修剪、改組、輸出和操作樹的方法,而這種方法要比 XML 文檔的線性表示更為便利。
將 HTML 轉(zhuǎn)換成 XML
有效的 HTML 幾乎就是有效的 XML,但又不完全相同。這里有兩個(gè)主要的差異,XML 標(biāo)記是區(qū)分大小寫的,并且所有 XML 標(biāo)記都需要一個(gè)顯式的結(jié)束符號(作為結(jié)束標(biāo)記,而這對于某些 HTML 標(biāo)記是可選的;例如: <img src="X.png" /> )。使用 xml.dom 的一個(gè)簡單示例就是使用 HtmlBuilder() 類將 HTML 轉(zhuǎn)換成 XML。
try_dom1.py
"""Convert a valid HTML document to XML USAGE: python try_dom1.py < infile.html > outfile.xml""" import sys from xml.dom import core from xml.dom.html_builder import HtmlBuilder # Construct an HtmlBuilder object and feed the data to itb = HtmlBuilder()b.feed(sys.stdin.read()) # Get the newly-constructed document objectdoc = b.document # Output it as XML print doc.toxml()
HtmlBuilder() 類很容易實(shí)現(xiàn)它繼承的部分基本 xml.dom.builder 模板的功能,它的源碼值得研究。然而,即使我們自己實(shí)現(xiàn)了模板功能,DOM 程序的輪廓還是相似的。在一般情況下,我們將用一些方法構(gòu)建一個(gè) DOM 實(shí)例,然后對該實(shí)例進(jìn)行操作。DOM 實(shí)例的 .toxml() 方法是一種生成 DOM 實(shí)例的字符串表示的簡單方法(在以上的情況中,只要在生成后將它打印出來)。
將 Python 對象轉(zhuǎn)換成 XML
Python 程序員可以通過將任意 Python 對象導(dǎo)出為 XML 實(shí)例來實(shí)現(xiàn)相當(dāng)多的功能和通用性。這就允許我們以習(xí)慣的方式來處理 Python 對象,并且可以選擇最終是否使用實(shí)例屬性作為生成 XML 中的標(biāo)記。只需要幾行(從 building.py 示例派生出),我們就可以將 Python“原生”對象轉(zhuǎn)換成 DOM 對象,并對包含對象的那些屬性執(zhí)行遞歸處理。
新聞熱點(diǎn)
疑難解答
圖片精選