<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 10.5.?根據節點類型創建不同的處理器 第三個有用的 XML 處理技巧是將你的代碼基于節點類型和元素名稱分散到邏輯函數中。解析后的 XML 文檔是由各種類型的節點組成的,每一個都是通過 Python 對象表示的。文檔本身的根層次通過一個 `Document` 對象表示。`Document` 還包含了一個或多個 `Element` 對象 (表示 XML 標記),其中的每一個可以包含其它的 `Element` 對象、`Text` 對象 (表示文本),或者 `Comment` 對象 (表示內嵌注釋)。使用 Python 編寫分離各個節點類型邏輯的分發器非常容易。 ## 例?10.17.?已解析 XML 對象的類名 ``` >>> from xml.dom import minidom >>> xmldoc = minidom.parse('kant.xml') >>> xmldoc <xml.dom.minidom.Document instance at 0x01359DE8> >>> xmldoc.__class__ <class xml.dom.minidom.Document at 0x01105D40> >>> xmldoc.__class__.__name__ 'Document' ``` | | | | --- | --- | | \[1\] | 暫時假設 `kant.xml` 在當前目錄中。 | | \[2\] | 正如你在[第?9.2?節 “包”](../xml_processing/packages.html "9.2.?包")中看到的,解析 XML 文檔返回的對象是一個 `Document` 對象,就像在 `xml.dom` 包的 `minidom.py` 中定義的一樣。又如你在[第?5.4?節 “類的實例化”](../object_oriented_framework/instantiating_classes.html "5.4.?類的實例化")中看到的,`__class__` 是每個 Python 對象的一個內置屬性。 | | \[3\] | 此外,`__name__` 是每個 Python 類的內置屬性,是一個字符串。這個字符串并不神秘;它和你在定義類時輸入的類名相同。(參見[第?5.3?節 “類的定義”](../object_oriented_framework/defining_classes.html "5.3.?類的定義")。) | 好,現在你能夠得到任何給定 XML 節點的類名了 (因為每個 XML 節點都是以一個 Python 對象表示的)。你怎樣才能利用這點來分離解析每個節點類型的邏輯呢?答案就是 `getattr`,你第一次見它是在[第?4.4?節 “通過 getattr 獲取對象引用”](../power_of_introspection/getattr.html "4.4.?通過 getattr 獲取對象引用")中。 ## 例?10.18.?`parse`,通用 XML 節點分發器 ``` def parse(self, node): parseMethod = getattr(self, "parse_%s" % node.__class__.__name__) parseMethod(node) ``` | | | | --- | --- | | \[1\] | 首先,注意你正在基于傳入節點 (`node` 參數) 的類名構造一個較大的字符串。所以如果你傳入一個 `Document` 節點,你就構造了字符串 `'parse_Document'`,其它類同于此。 | | \[2\] | 現在你可以把這個字符串當作一個函數名稱,然后通過 `getattr` 得到函數自身的引用。 | | \[3\] | 最后,你可以調用函數并將節點自身作為參數傳入。下一個例子將展示每個函數的定義。 | ## 例?10.19.?`parse` 分發器調用的函數 ``` def parse_Document(self, node): self.parse(node.documentElement) def parse_Text(self, node): text = node.data if self.capitalizeNextWord: self.pieces.append(text[0].upper()) self.pieces.append(text[1:]) self.capitalizeNextWord = 0 else: self.pieces.append(text) def parse_Comment(self, node): pass def parse_Element(self, node): handlerMethod = getattr(self, "do_%s" % node.tagName) handlerMethod(node) ``` | | | | --- | --- | | \[1\] | `parse_Document` 只會被調用一次,因為在一個 XML 文檔中只有一個 `Document` 節點,并且在已解析 XML 的表示中只有一個 `Document` 對象。在此它只是起到中轉作用,轉而解析語法文件的根元素。 | | \[2\] | `parse_Text` 在節點表示文本時被調用。這個函數本身做某種特殊處理,自動將句子的第一個單詞進行大寫處理,而不是簡單地將表示的文本追加到一個列表中。 | | \[3\] | `parse_Comment` 只有一個 `pass`,因為你并不關心語法文件中嵌入的注釋。但是注意,你還是要定義這個函數并顯式地讓它不做任何事情。如果這個函數不存在,通用 `parse` 函數在遇到一個注釋的時候會執行失敗,因為它試圖找到并不存在的 `parse_Comment` 函數。為每個節點類型定義獨立的函數――甚至你不要使用的――將會使通用 `parse` 函數保持簡單和沉默。 | | \[4\] | `parse_Element` 方法其實本身就是一個分發器,一個基于元素的標記名稱的分發器。這個基本概念是相同的:使用元素的區別 (它們的標記名稱) 然后針對每一個分發到一個獨立的函數。你構建了一個類似于 `'do_xref'` 的字符串 (對 `&lt;xref&gt;` 標記而言),找到這個名稱的函數,并調用它。對其它的標記名稱 (像`&lt;p&gt;` 和 `&lt;choice&gt;`) 在解析語法文件的時候都可以找到類似的函數。 | 在這個例子中,分發函數 `parse` 和 `parse_Element` 只是找到相同類中的其它方法。如果你進行的處理過程很復雜 (或者你有很多不同的標記名稱),你可以將代碼分散到獨立的模塊中,然后使用動態導入的方式導入每個模塊并調用你需要的任何函數。動態導入將在[第?16?章 _函數編程_](../functional_programming/index.html "第?16?章?函數編程")中介紹。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看