<span id="7ztzv"></span>
<sub id="7ztzv"></sub>

<span id="7ztzv"></span><form id="7ztzv"></form>

<span id="7ztzv"></span>

        <address id="7ztzv"></address>

            9.3. XML 解析

            正如我說的,實際解析一個 XML 文檔是非常簡單的:只要一行代碼。從這里出發到哪兒去就是你自己的事了。

            例 9.8. 載入一個 XML 文檔 (這次是真的)

            >>> from xml.dom import minidom                                          1
            >>> xmldoc = minidom.parse('~/diveintopython/common/py/kgp/binary.xml')  2
            >>> xmldoc                                                               3
            <xml.dom.minidom.Document instance at 010BE87C>
            >>> print xmldoc.toxml()                                                 4
            <?xml version="1.0" ?>
            <grammar>
            <ref id="bit">
              <p>0</p>
              <p>1</p>
            </ref>
            <ref id="byte">
              <p><xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/>\
            <xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/></p>
            </ref>
            </grammar>
            1 正如在上一節看到的,該語句從 xml.dom 包中導入 minidom 模塊。
            2 這就是進行所有工作的一行代碼:minidom.parse 接收一個參數并返回 XML 文檔解析后的表示形式。這個參數可以是很多東西;在本例中,它只是我本地磁盤上一個 XML 文檔的文件名。(你需要將路徑改為指向下載的例子所在的目錄。) 但是你也可以傳入一個文件對象,或甚至是一個類文件對象。這樣你就可以在本章后面好好利用這一靈活性了。
            3 minidom.parse 返回的對象是一個 Document 對象,它是 Node 類的一個子對象。這個 Document 對象是聯鎖的 Python 對象的一個復雜樹狀結構的根層次,這些 Python 對象完整表示了傳給 minidom.parseXML 文檔。
            4 toxmlNode 類的一個方法 (因此可以在從 minidom.parse 中得到的 Document 對象上使用)。toxml 打印出了 Node 表示的 XML。對于 Document 節點,這樣就會打印出整個 XML 文檔。

            現在內存中已經有了一個 XML 文檔了,你可以開始遍歷它了。

            例 9.9. 獲取子節點

            >>> xmldoc.childNodes    1
            [<DOM Element: grammar at 17538908>]
            >>> xmldoc.childNodes[0] 2
            <DOM Element: grammar at 17538908>
            >>> xmldoc.firstChild    3
            <DOM Element: grammar at 17538908>
            1 每個 Node 都有一個 childNodes 屬性,它是一個 Node 對象的列表。一個 Document 只有一個子節點,即 XML 文檔的根元素 (在本例中,是 grammar 元素)。
            2 為了得到第一個 (在本例中,只有一個) 子節點,只要使用正規的列表語法。回想一下,其實這里沒有發生什么特別的;這只是一個由正規 Python 對象構成的正規 Python 列表。
            3 鑒于獲取某個節點的第一個子節點是有用而且常見的行為,所以 Node 類有一個 firstChild 屬性,它和childNodes[0]具有相同的語義。(還有一個 lastChild 屬性,它和childNodes[-1]具有相同的語義。)

            例 9.10. toxml 用于任何節點

            >>> grammarNode = xmldoc.firstChild
            >>> print grammarNode.toxml() 1
            <grammar>
            <ref id="bit">
              <p>0</p>
              <p>1</p>
            </ref>
            <ref id="byte">
              <p><xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/>\
            <xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/></p>
            </ref>
            </grammar>
            1 由于 toxml 方法是定義在 Node 類中的,所以對任何 XML 節點都是可用的,不僅僅是 Document 元素。

            例 9.11. 子節點可以是文本

            >>> grammarNode.childNodes                  1
            [<DOM Text node "\n">, <DOM Element: ref at 17533332>, \
            <DOM Text node "\n">, <DOM Element: ref at 17549660>, <DOM Text node "\n">]
            >>> print grammarNode.firstChild.toxml()    2
            
            
            
            >>> print grammarNode.childNodes[1].toxml() 3
            <ref id="bit">
              <p>0</p>
              <p>1</p>
            </ref>
            >>> print grammarNode.childNodes[3].toxml() 4
            <ref id="byte">
              <p><xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/>\
            <xref id="bit"/><xref id="bit"/><xref id="bit"/><xref id="bit"/></p>
            </ref>
            >>> print grammarNode.lastChild.toxml()     5
            
            
            
            1 查看 binary.xml 中的 XML ,你可能會認為 grammar 只有兩個子節點,即兩個 ref 元素。但是你忘記了一些東西:硬回車!在'<grammar>'之后,第一個'<ref>'之前是一個硬回車,并且這個文本算作 grammar 元素的一個子節點。類似地,在每個'</ref>'之后都有一個硬回車;它們都被當作子節點。所以grammar.childNodes實際上是一個有5個對象的列表:3個 Text 對象和兩個 Element 對象。
            2 第一個子節點是一個 Text 對象,它表示在'<grammar>'標記之后、第一個'<ref>'標記之后的硬回車。
            3 第二個子節點是一個 Element 對象,表示了第一個 ref 元素。
            4 第四個子節點是一個 Element 對象,表示了第二個 ref 元素。
            5 最后一個子節點是一個 Text 對象,表示了在'</ref>'結束標記之后、'</grammar>' 結束標記之前的硬回車。

            例 9.12. 把文本挖出來

            >>> grammarNode
            <DOM Element: grammar at 19167148>
            >>> refNode = grammarNode.childNodes[1] 1
            >>> refNode
            <DOM Element: ref at 17987740>
            >>> refNode.childNodes                  2
            [<DOM Text node "\n">, <DOM Text node "  ">, <DOM Element: p at 19315844>, \
            <DOM Text node "\n">, <DOM Text node "  ">, \
            <DOM Element: p at 19462036>, <DOM Text node "\n">]
            >>> pNode = refNode.childNodes[2]
            >>> pNode
            <DOM Element: p at 19315844>
            >>> print pNode.toxml()                 3
            <p>0</p>
            >>> pNode.firstChild                    4
            <DOM Text node "0">
            >>> pNode.firstChild.data               5
            u'0'
            1 正如你在前面的例子中看到的,第一個 ref 元素是 grammarNode.childNodes[1],因為 childNodes[0] 是一個代表硬回車的 Text 節點。
            2 ref 元素有它自己的子節點集合,一個表示硬回車,另一個表示空格,一個表示 p 元素,諸如此類。
            3 你甚至可以在這里使用 toxml 方法,盡管它深深嵌套在文檔中。
            4 p 元素只有一個子節點 (在這個例子中無法看出,但是如果你不信,可以看看pNode.childNodes),而且它是表示單字符'0'的一個 Text 節點。
            5 Text 節點的 .data 屬性可以向你提供文本節點真正代表的字符串。但是字符串前面的'u'是什么意思呢?答案將自己專門有一部分來論述。
            <span id="7ztzv"></span>
            <sub id="7ztzv"></sub>

            <span id="7ztzv"></span><form id="7ztzv"></form>

            <span id="7ztzv"></span>

                  <address id="7ztzv"></address>

                      亚洲欧美在线