最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Python中DOM方法的動(dòng)態(tài)性

 更新時(shí)間:2015年04月11日 15:24:15   投稿:goldensun  
這篇文章主要介紹了詳解Python中DOM方法的動(dòng)態(tài)性,xml.dom模塊在Python的網(wǎng)絡(luò)編程中相當(dāng)有用,本文來(lái)自于IBM官網(wǎng)的開發(fā)者技術(shù)文檔,需要的朋友可以參考下

文檔對(duì)象模型

xml.dom 模塊對(duì)于 Python 程序員來(lái)說(shuō),可能是使用 XML 文檔時(shí)功能最強(qiáng)大的工具。不幸的是,XML-SIG 提供的文檔目前來(lái)說(shuō)還比較少。W3C 語(yǔ)言無(wú)關(guān)的 DOM 規(guī)范填補(bǔ)了這方面的部分空白。但 Python 程序員最好有一個(gè)特定于 Python 語(yǔ)言的 DOM 的快速入門指南。本文旨在提供這樣一個(gè)指南。在 上一篇專欄文章 中,某些樣本中使用了樣本 quotations.dtd 文件,并且這些文件可以與本文中的代碼樣本檔案文件一起使用。

有必要了解 DOM 的確切含義。這方面,正式解釋非常好:

    “文檔對(duì)象模型”是平臺(tái)無(wú)關(guān)和語(yǔ)言無(wú)關(guān)的接口,它允許程序和腳本動(dòng)態(tài)訪問(wèn)和更新文檔的內(nèi)容、結(jié)構(gòu)和樣式。可以進(jìn)一步處理文檔,而處理的結(jié)果也可以合并到已顯示的頁(yè)面中。(萬(wàn)維網(wǎng)聯(lián)盟 DOM 工作組)

DOM 將 XML 文檔轉(zhuǎn)換成樹 -- 或森林 -- 表示。萬(wàn)維網(wǎng)聯(lián)盟 (W3C) 規(guī)范給出了一個(gè) HTML 表的 DOM 版本作為例子。

2015411151828304.gif (368×205)

如上圖所示,DOM 從一個(gè)更加抽象的角度定義了一組可以遍歷、修剪、改組、輸出和操作樹的方法,而這種方法要比 XML 文檔的線性表示更為便利。

將 HTML 轉(zhuǎn)換成 XML

有效的 HTML 幾乎就是有效的 XML,但又不完全相同。這里有兩個(gè)主要的差異,XML 標(biāo)記是區(qū)分大小寫的,并且所有 XML 標(biāo)記都需要一個(gè)顯式的結(jié)束符號(hào)(作為結(jié)束標(biāo)記,而這對(duì)于某些 HTML 標(biāo)記是可選的;例如: <img src="X.png" /> )。使用 xml.dom 的一個(gè)簡(jiǎn)單示例就是使用 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 it
b = HtmlBuilder()
b.feed(sys.stdin.read())
    
    # Get the newly-constructed document object
doc = 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í)例,然后對(duì)該實(shí)例進(jìn)行操作。DOM 實(shí)例的 .toxml() 方法是一種生成 DOM 實(shí)例的字符串表示的簡(jiǎn)單方法(在以上的情況中,只要在生成后將它打印出來(lái))。

將 Python 對(duì)象轉(zhuǎn)換成 XML

Python 程序員可以通過(guò)將任意 Python 對(duì)象導(dǎo)出為 XML 實(shí)例來(lái)實(shí)現(xiàn)相當(dāng)多的功能和通用性。這就允許我們以習(xí)慣的方式來(lái)處理 Python 對(duì)象,并且可以選擇最終是否使用實(shí)例屬性作為生成 XML 中的標(biāo)記。只需要幾行(從 building.py 示例派生出),我們就可以將 Python“原生”對(duì)象轉(zhuǎn)換成 DOM 對(duì)象,并對(duì)包含對(duì)象的那些屬性執(zhí)行遞歸處理。
try_dom2.py

"""Build a DOM instance from scratch, write it to XML
  USAGE: python try_dom2.py > outfile.xml
"""
    
    
import
    
     types
    
    from
    
     xml.dom 
    
    import
    
     core
    
    from
    
     xml.dom.builder 
    
    import
    
     Builder
    
    # Recursive function to build DOM instance from Python instance
    
    
defobject_convert
    
    (builder, inst):
  
    
    # Put entire object inside an elem w/ same name as the class.
  builder.startElement(inst.__class__.__name__)
  
    
    for
    
     attr 
    
    in
    
     inst.__dict__.keys():
    
    
    if
    
     attr[0] == 
    
    '_':   
    
    # Skip internal attributes
              
     
     continue
    
    
    value = getattr(inst, attr)
    
    
    if
    
     type(value) == types.InstanceType:
      
    
    # Recursively process subobjects
      object_convert(builder, value)
    
    
    else
    
    :
      
    
    # Convert anything else to string, put it in an element
      builder.startElement(attr)
      builder.text(str(value))
      builder.endElement(attr)
  builder.endElement(inst.__class__.__name__)
    
    if
    
     __name__ == 
    
    '__main__':
  
    
    # Create container classes
    
    
  classquotations
    
    : 
    
    pass
  classquotation
    
    : 
    
    pass
    # Create an instance, fill it with hierarchy of attributes
    
    
  inst = quotations()
  inst.title = 
    
    "Quotations file (not quotations.dtd conformant)"
  inst.quot1 = quot1 = quotation()
  quot1.text = 
    
    """'"is not a quine" is not a quine' is a quine"""
  quot1.source = 
    
    "Joshua Shagam, kuro5hin.org"
  inst.quot2 = quot2 = quotation()
  quot2.text = 
    
    "Python is not a democracy. Voting doesn't help. "+\
         
    
    "Crying may..."
  quot2.source = 
    
    "Guido van Rossum, comp.lang.python"
    
    

     # Create the DOM Builder
  builder = Builder()
  object_convert(builder, inst)
  
    
    print
    
     builder.document.toxml()

函數(shù) object_convert() 有一些限制。例如,不可能用以上的過(guò)程生成符合 XML 文檔的 quotations.dtd:#PCDATA 文本不能直接放到 quotation 類中,而只能放到類的屬性中(如 .text )。一個(gè)簡(jiǎn)單的變通方法就是讓 object_convert() 以特殊方式處理一個(gè)帶有名稱的屬性,例如 .PCDATA ??梢杂酶鞣N方法使對(duì) DOM 的轉(zhuǎn)換變得更巧妙,但該方法的妙處在于我們可以從整個(gè) Python 對(duì)象開始,以簡(jiǎn)明的方式將它們轉(zhuǎn)換成 XML 文檔。

還應(yīng)值得注意的是在生成的 XML 文檔中,處于同一個(gè)級(jí)別的元素沒(méi)有什么明顯的順序關(guān)系。例如,在作者的系統(tǒng)中使用特定版本的 Python,源碼中定義的第二個(gè) quotation 在輸出中卻第一個(gè)出現(xiàn)。但這種順序關(guān)系在不同的版本和系統(tǒng)之間會(huì)改變。Python 對(duì)象的屬性并不是按固定順序排列的,因此這種特性就具有意義。對(duì)于與數(shù)據(jù)庫(kù)系統(tǒng)相關(guān)的數(shù)據(jù),我們希望它們具有這種特性,但是對(duì)于標(biāo)記為 XML 的文章卻顯然不希望具有這種特性(除非我們想要更新 William Burroughs 的 "cut-up" 方法)。

將 XML 文檔轉(zhuǎn)換成 Python 對(duì)象

從 XML 文檔生成 Python 對(duì)象就像其逆向過(guò)程一樣簡(jiǎn)單。在多數(shù)情況下,用 xml.dom 方法就可以了。但在某些情況下,最好使用與處理所有“類屬”Python 對(duì)象相同的技術(shù)來(lái)處理從 XML 文檔生成的對(duì)象。例如,在以下的代碼中,函數(shù) pyobj_printer() 也許是已經(jīng)用來(lái)處理任意 Python 對(duì)象的函數(shù)。
try_dom3.py

"""Read in a DOM instance, convert it to a Python object
"""
    
    
from
    
     xml.dom.utils 
    
    import
    
     FileReader
    
    classPyObject
    
    : 
    
    pass
defpyobj_printer
    
    (py_obj, level=0):
  
    
    """Return a "deep" string description of a Python object"""
     
     
     from
     
     
    
     string 
    
    import
    
     join, split
  
    
    import
    
     types
  descript = 
    
    ''
     
     
     for
     
     
    
     membname 
    
    in
    
     dir(py_obj):
    member = getattr(py_obj,membname)
    
    
    if
    
     type(member) == types.InstanceType:
      descript = descript + (
    
    ' '*level) + 
    
    '{'+membname+
    
    '}\n'
      descript = descript + pyobj_printer(member, level+3)
    
    
    elif
    
     type(member) == types.ListType:
      descript = descript + (
    
    ' '*level) + 
    
    '['+membname+
    
    ']\n'
             
     
     for
     
     
    
     i 
    
    in
    
     range(len(member)):
        descript = descript+(
    
    ' '*level)+str(i+1)+
    
    ': '+ \
              pyobj_printer(member[i],level+3)
    
    
    else
    
    :
      descript = descript + membname+
    
    '='
      descript = descript + join(split(str(member)[:50]))+
    
    '...\n'
     
     
     return
     
     
    
     descript
    
    defpyobj_from_dom
    
    (dom_node):
  
    
    """Converts a DOM tree to a "native" Python object"""
  py_obj = PyObject()
  py_obj.PCDATA = 
    
    ''
     
     
     for
     
     
    
     node 
    
    in
    
     dom_node.get_childNodes():
    
    
    if
    
     node.name == 
    
    '#text':
      py_obj.PCDATA = py_obj.PCDATA + node.value
    
    
    elif
    
     hasattr(py_obj, node.name):
      getattr(py_obj, node.name).append(pyobj_from_dom(node))
    
    
    else
    
    :
      setattr(py_obj, node.name, [pyobj_from_dom(node)])
  
    
    return
    
     py_obj
    
    # Main test
dom_obj = FileReader(
    
    "quotes.xml").document
py_obj = pyobj_from_dom(dom_obj)
    
    if
    
     __name__ == 
    
    "__main__":
  
    
    print
    
     pyobj_printer(py_obj)

這里的關(guān)注焦點(diǎn)應(yīng)該是函數(shù) pyobj_from_dom() ,特別是起實(shí)際作用的 xml.dom 方法 .get_childNodes() 。在 pyobj_from_dom() 中,我們直接抽取標(biāo)記之間的所有文本,將它放到保留屬性 .PCDATA 中。對(duì)于任何遇到的嵌套標(biāo)記,我們創(chuàng)建一個(gè)新屬性,其名稱與標(biāo)記匹配,并將一個(gè)列表分配給該屬性,這樣就可以潛在地包含在在父代塊中多次出現(xiàn)的標(biāo)記。當(dāng)然,使用列表要維護(hù)在 XML 文檔中遇到的標(biāo)記的順序。

除了使用舊的 pyobj_printer() 類屬函數(shù)(或者,更復(fù)雜和健壯的函數(shù))之外,我們可以使用正常的屬性記號(hào)來(lái)訪問(wèn) py_obj 的元素。
Python 交互式會(huì)話

>>> 
    
    from
    
     try_dom3 
    
    import
    
     *
>>> py_obj.quotations[0].quotation[3].source[0].PCDATA
    
    'Guido van Rossum, '

重新安排 DOM 樹

DOM 的一大優(yōu)點(diǎn)是它可以讓程序員以非線性方式對(duì) XML 文檔進(jìn)行操作。由相匹配的開/關(guān)標(biāo)記括起的每一塊都只是 DOM 樹中的一個(gè)“節(jié)點(diǎn)”。當(dāng)以類似于列表的方式維護(hù)節(jié)點(diǎn)以保留順序信息時(shí),則順序并沒(méi)有什么特殊之處,也并非不可改變。我們可以輕易地剪下某個(gè)節(jié)點(diǎn),嫁接到 DOM 樹的另一個(gè)位置(如果 DTD 允許,甚至嫁接到另一層上)。或者添加新的節(jié)點(diǎn)、刪除現(xiàn)有節(jié)點(diǎn),等等。
try_dom4.py

"""Manipulate the arrangement of nodes in a DOM object
"""
    
    
from
    
     try_dom3 
    
    import
    
     *
    
    #-- Var 'doc' will hold the single <quotations> "trunk"
doc = dom_obj.get_childNodes()[0]
    
    #-- Pull off all the nodes into a Python list
# (each node is a <quotation> block, or a whitespace text node)
nodes = []
    
    while
    
     1:
  
    
    try
    
    : node = doc.removeChild(doc.get_childNodes()[0])
  
    
    except
    
    : 
    
    break
    
    
  nodes.append(node)
    
    #-- Reverse the order of the quotations using a list method
# (we could also perform more complicated operations on the list:
# delete elements, add new ones, sort on complex criteria, etc.)
nodes.reverse()
    
    #-- Fill 'doc' back up with our rearranged nodes
    
    
for
    
     node 
    
    in
    
     nodes:
  
    
    # if second arg is None, insert is to end of list
  doc.insertBefore(node, None)
    
    #-- Output the manipulated DOM
    
    
print
    
     dom_obj.toxml()

如果我們將 XML 文檔只看作一個(gè)文本文件,或者使用一個(gè)面向序列的模塊(如 xmllib 或 xml.sax),那么在以上幾行中執(zhí)行對(duì) quotation 節(jié)點(diǎn)的重新安排操作將引出一個(gè)值得考慮的問(wèn)題。然而如果使用 DOM,則問(wèn)題就如同對(duì) Python 列表執(zhí)行的任何其它操作一樣簡(jiǎn)單。

相關(guān)文章

  • python鏈接oracle數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)的增刪改查實(shí)例

    python鏈接oracle數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)的增刪改查實(shí)例

    下面小編就為大家分享一篇python鏈接oracle數(shù)據(jù)庫(kù)以及數(shù)據(jù)庫(kù)的增刪改查實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • python中如何正確使用正則表達(dá)式的詳細(xì)模式(Verbose mode expression)

    python中如何正確使用正則表達(dá)式的詳細(xì)模式(Verbose mode expression)

    許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(dá)式進(jìn)行字符串操作,python自然也不例外,下面這篇文章主要給大家介紹了關(guān)于在python中如何正確使用正則表達(dá)式的詳細(xì)模式(Verbose mode expression)的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-11-11
  • Python中操作PDF文件的常用方法

    Python中操作PDF文件的常用方法

    在 Python 中操作 PDF 文件的常用方法是使用專門的第三方庫(kù),這些庫(kù)可以幫助你完成常見的操作,如讀取 PDF 內(nèi)容、提取文本、合并和拆分 PDF 文件、修改文件等,常用的庫(kù)包括 PyPDF2、pdfminer、reportlab 等,下面是一些常見任務(wù)的示例,需要的朋友可以參考下
    2025-02-02
  • Python二分查找詳解

    Python二分查找詳解

    這篇文章主要給大家匯總介紹了Python二分查找的幾種實(shí)現(xiàn)的方法,有需要的小伙伴可以參考下。
    2015-09-09
  • Python多項(xiàng)式回歸的實(shí)現(xiàn)方法

    Python多項(xiàng)式回歸的實(shí)現(xiàn)方法

    這篇文章主要介紹了Python多項(xiàng)式回歸的實(shí)現(xiàn)方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • python二維鍵值數(shù)組生成轉(zhuǎn)json的例子

    python二維鍵值數(shù)組生成轉(zhuǎn)json的例子

    今天小編就為大家分享一篇python二維鍵值數(shù)組生成轉(zhuǎn)json的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • 利用Python來(lái)實(shí)現(xiàn)阿姆斯特朗數(shù)的檢查實(shí)例

    利用Python來(lái)實(shí)現(xiàn)阿姆斯特朗數(shù)的檢查實(shí)例

    這篇文章主要給大家介紹了關(guān)于利用Python來(lái)實(shí)現(xiàn)阿姆斯特朗數(shù)的檢查的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python中zip()函數(shù)的簡(jiǎn)單用法舉例

    Python中zip()函數(shù)的簡(jiǎn)單用法舉例

    這篇文章主要給大家介紹了關(guān)于Python中zip()函數(shù)的簡(jiǎn)單用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python 專題四 文件基礎(chǔ)知識(shí)

    Python 專題四 文件基礎(chǔ)知識(shí)

    本文主要講述了Python文件基礎(chǔ)知識(shí),包括文件的打開、讀寫、關(guān)閉操作、使用循環(huán)讀寫文件及迭代器的知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • python中g(shù)lobal與nonlocal比較

    python中g(shù)lobal與nonlocal比較

    這篇文章主要介紹了python中g(shù)lobal與nonlocal比較,global關(guān)鍵字用來(lái)在函數(shù)或其他局部作用域中使用全局變量,nonlocal關(guān)鍵字用來(lái)在函數(shù)或其他作用域中使用外層(非全局)變量,需要的朋友可以參考下
    2014-11-11

最新評(píng)論

颍上县| 启东市| 会东县| 富平县| 夹江县| 呼图壁县| 苍山县| 巴马| 和田县| 宁强县| 凤山县| 平湖市| 牙克石市| 肥东县| 隆昌县| 武乡县| 娄烦县| 芮城县| 瑞金市| 清水河县| 安乡县| 平利县| 遂昌县| 嘉祥县| 江口县| 灌南县| 富锦市| 华容县| 遵义县| 凤冈县| 资中县| 宜宾市| 仁布县| 龙陵县| 东兰县| 新宁县| 金溪县| 扶绥县| 松原市| 桓仁| 定兴县|