在 Python 中建立 XML 解析器

Vaibhhav Khetarpal 2023年10月10日
  1. 在 Python 中使用 ElementTree API 解析 XML 文件
  2. 在 Python 中使用 minidom 模組解析 XML 文件
  3. 在 Python 中使用 Beautiful Soup 庫解析 XML 文件
  4. 在 Python 中使用 xmltodict 庫解析 XML 文件
  5. 在 Python 中使用 lxml 庫解析 XML 文件
  6. 在 Python 中使用 untangle 模組解析 XML 文件
  7. 在 Python 中使用 declxml 庫解析 XML 文件
在 Python 中建立 XML 解析器

XML 是可擴充套件標記語言的縮寫,是一種用於儲存和傳輸資料的自描述語言。Python 為解析和修改 XML 文件提供了一種媒介。

本教程重點介紹並演示了在 Python 中解析 XML 文件的不同方法。

在 Python 中使用 ElementTree API 解析 XML 文件

xml.etree.ElementTree 模組用於生成高效而簡單的 API 來解析 XML 文件並建立 XML 資料。

以下程式碼使用 xml.etree.ElementTree 模組在 Python 中解析 XML 文件。

# >= Python 3.3 code
import xml.etree.ElementTree as ET

file1 = """<foo>
           <bar>
               <type foobar="Hello"/>
               <type foobar="God"/>
          </bar>
       </foo>"""
tree = ET.fromstring(file1)
x = tree.findall("bar/type")
for item in x:
    print(item.get("foobar"))

輸出:

Hello
God

在這裡,我們將 XML 資料作為三引號內的字串傳遞。我們還可以在 ElementTree 模組的 parse() 函式的幫助下匯入一個實際的 XML 文件。

cElementTree 模組是 ElementTree API 的 C 實現,唯一的區別是優化了 cElementTree。話雖如此,它的解析速度比 ElementTree 模組快 15-20 倍,並且使用的記憶體量非常低。

但是,在 Python 3.3 及更高版本中,cElementTree 模組已被棄用,而 ElementTree 模組使用更快的實現。

在 Python 中使用 minidom 模組解析 XML 文件

xml.dom.minidom 可以定義為文件物件模型 (DOM) 介面的基本實現。所有 DOM 應用程式通常都從解析 XML 物件開始。因此,該方法是 Python 中解析 XML 文件最快的方法。

以下程式碼使用 minidom 模組中的 parse() 函式來解析 Python 中的 XML 文件。

XML 檔案 (sample1.xml):

<data>
    <strings>
        <string name="Hello"></string>
        <string name="God"></string>
    </strings>
</data>

Python 程式碼:

from xml.dom import minidom

xmldoc = minidom.parse("sample1.xml")
stringlist = xmldoc.getElementsByTagName("string")
print(len(stringlist))
print(stringlist[0].attributes["name"].value)
for x in stringlist:
    print(x.attributes["name"].value)

輸出:

2
Hello
God

該模組還允許將 XML 作為字串傳遞,類似於 ElementTree API。然而,它使用 parseString() 函式來實現這一點。

據說 xml.etree.ElementTreexml.dom.minidom 模組對於惡意構造的資料都是不安全的。

在 Python 中使用 Beautiful Soup 庫解析 XML 文件

Beautiful Soup 庫是為網頁抓取專案和從 XMLHTML 檔案中提取資料而設計的。美麗的湯速度非常快,可以解析它遇到的任何東西。

該庫甚至為程式執行樹遍歷過程並解析 XML 文件。此外,Beautiful Soup 還用於美化給定的原始碼。

Beautiful Soup 庫需要手動安裝,然後匯入到此方法的 Python 程式碼中。這個庫可以使用 pip 命令安裝。Beautiful Soup 4 庫是最新版本,適用於 Python 2.7 及更高版本。

以下程式碼使用 Beautiful Soup 庫在 Python 中解析 XML 文件。

from bs4 import BeautifulSoup

file1 = """<foo>
   <bar>
      <type foobar="Hello"/>
      <type foobar="God"/>
   </bar>
</foo>"""

a = BeautifulSoup(file1)
print(a.foo.bar.type["foobar"])
print(a.foo.bar.findAll("type"))

輸出:

u'Hello'
[<type foobar="Hello"></type>, <type foobar="God"></type>]

Beautiful Soup 比任何其他用於解析的工具都要快,但有時可能很難理解和實現這種方法。

在 Python 中使用 xmltodict 庫解析 XML 文件

xmltodict 庫有助於使處理 XML 檔案的過程類似於 JSON。它也可以用於我們想要解析 XML 檔案的情況。在這種情況下,可以通過將 XML 檔案解析為 Ordered Dictionary 來使用 xmltodict 模組。

xmltodict 庫需要手動安裝,然後匯入到包含 XML 檔案的 Python 程式碼中。xmltodict 的安裝非常基本,可以使用標準的 pip 命令完成。

以下程式碼使用 xmltodict 庫來解析 Python 中的 XML 文件。

import xmltodict

file1 = """<foo>
             <bar>
                 <type foobar="Hello"/>
                 <type foobar="God"/>
             </bar>
        </foo> """
result = xmltodict.parse(file1)
print(result)

輸出:

OrderedDict([(u'foo', OrderedDict([(u'bar', OrderedDict([(u'type', [OrderedDict([(u'@foobar', u'Hello')]), OrderedDict([(u'@foobar', u'God')])])]))]))])

在 Python 中使用 lxml 庫解析 XML 文件

lxml 庫能夠在 Python 中提供一個簡單但非常強大的 API,用於解析 XML 和 HTML 檔案。它結合了 ElementTree API 和 libxml2/libxslt

簡單來說,lxml 庫進一步擴充套件了舊的 ElementTree 庫,以提供對 XML Schema、XPath 和 XSLT 等新事物的支援。

在這裡,我們將使用 lxml.objectify 庫。以下程式碼使用 lxml 庫在 Python 中解析 XML 文件。

from collections import defaultdict
from lxml import objectify

file1 = """<foo>
                <bar>
                    <type foobar="1"/>
                    <type foobar="2"/>
                </bar>
            </foo>"""

c = defaultdict(int)

root = objectify.fromstring(file1)

for item in root.bar.type:
    c[item.attrib.get("foobar")] += 1

print(dict(c))

輸出:

{'1': 1, '2': 1}

在這裡,在這個程式中,c 變數用於儲存字典中每個可用專案的計數。

在 Python 中使用 untangle 模組解析 XML 文件

untangle 模組是一個易於實現的模組,專注於將 XML 轉換為 Python 物件。它也可以使用 pip 命令輕鬆安裝。此模組適用於 Python 2.7 及更高版本。

以下程式碼使用 untangle 模組在 Python 中解析 XML 文件。

XML 檔案 (sample1.xml):

<foo>
   <bar>
      <type foobar="Hello"/>
   </bar>
</foo>

Python 程式碼:

import untangle

x = untangle.parse("/path_to_xml_file/sample1.xml")
print(x.foo.bar.type["foobar"])

輸出:

Hello

在 Python 中使用 declxml 庫解析 XML 文件

declxml 庫是 Declarative XML Processing 的縮寫,用於提供一個簡單的 API 來序列化和解析 XML 文件。該庫旨在減少程式設計師的工作量,並取代在使用其他流行的 API(例如 minidomElementTree)時,需要處理大而長的解析邏輯程式碼塊。

declxml 模組可以通過使用 pippipenv 命令輕鬆安裝在系統中。以下程式碼使用 declxml 庫來解析 Python 中的 XML 文件。

import declxml as xml

xml_string = """
<foo>
   <bar>
      <type foobar="1"/>
      <type foobar="3"/>
      <type foobar="5"/>
   </bar>
</foo>
"""

processor = xml.dictionary(
    "foo", [xml.dictionary("bar", [xml.array(xml.integer("type", attribute="foobar"))])]
)

xml.parse_from_string(processor, xml_string)

輸出:

{'bar': {'foobar': [1, 3, 5]}}

在這種方法中,我們使用處理器來宣告性地表徵給定 XML 文件的結構以及 XML 和 Python 資料結構之間的對映。

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn

相關文章 - Python XML