<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    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'是什么意思呢?答案將自己專門有一部分來論述。

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频