XML Schema 定義了 XML 檔案的結構和內容,其中複合型別允許開發者建立更複雜的資料結構。使用 xs:complexType 可以定義包含多個元素和屬性的型別,並利用 xs:sequence 控制子元素的順序。Python 的 xmlschema 函式庫提供了驗證 XML 檔案是否符合 Schema 的功能,確保資料的完整性和一致性。解析 XML 檔案時,SAX(Simple API for XML)提供事件驅動的解析方式,而 XPath 則允許使用路徑表示式查詢 XML 檔案中的特定節點和屬性。這些技術結合使用,可以有效地提取和處理 XML 資料。TEI 作為一種根據 XML 的文字編碼標準,則為數字人文和文字分析提供了強大的工具。

元素(Element)

元素是 XML 檔案中的基本單位,代表了檔案中的一個單一專案。使用 xs:element 來定義一個元素,例如:

<xs:element name="h1" type="xs:string"/>

這裡定義了一個名為 h1 的元素,其型別為 xs:string,表示這個元素包含字串型別的內容。

複合型別(Complex Type)

複合型別允許你定義更複雜的結構,包括多個元素或屬性。使用 xs:complexType 來定義一個複合型別,例如:

<xs:element name="ul">
  <xs:complexType>
    <xs:sequence>
      <xs:element maxOccurs="unbounded" ref="li"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

這裡定義了一個名為 ul 的元素,其型別為一個複合型別。這個複合型別包含一個序列(xs:sequence),序列中包含一個名為 li 的元素,且這個元素可以出現零次或多次(maxOccurs="unbounded")。

序列(Sequence)

序列是一種組合方式,指示其子元素必須按照指定的順序出現。上面的例子中,ul 元素內的 li 元素必須按照順序出現。

參照(Reference)

在上面的例子中,ref="li" 用於參照另外一個名為 li 的元素定義。這允許你在不同的地方重用元素定義。

結合使用

當你結合使用元素和複合型別時,可以建立出複雜的 XML 檔案結構。例如:

<xs:element name="root">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="h1"/>
      <xs:element ref="ul"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

這裡定義了一個名為 root 的元素,其型別為一個複合型別。這個複合型別包含一個序列,序列中包含 h1ul 兩個元素。

內容解密:

  • xs:element 用於定義元素。
  • xs:complexType 用於定義複合型別。
  • xs:sequence 用於定義序列。
  • ref 屬性用於參照其他元素定義。

圖表翻譯:

  graph LR
    A[XML Schema] -->|定義|> B[xs:element]
    B -->|包含|> C[xs:complexType]
    C -->|包含|> D[xs:sequence]
    D -->|包含|> E[xs:element ref="li"]
    E -->|參照|> F[li 元素定義]

這個圖表展示了 XML Schema 中元素、複合型別、序列和參照的關係。

XML Schema 中的複合型別定義

在 XML Schema 中,xs:complexType 元素用於定義一個複合型別,這是一種可以包含其他元素和屬性的資料型別。讓我們來看看下面的範例:

<xs:element name="li">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="place"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

解釋

  • xs:element name="li":定義了一個名為 li 的元素。
  • xs:complexType:指出 li 元素是一個複合型別。
  • xs:sequence:指定了 li 元素內的子元素出現順序。
  • xs:element ref="place":參照了一個名為 place 的元素,表示 li 元素內必須包含一個 place 元素。

程式碼示例

假設我們想要在 Python 中解析這個 XML 結構,首先需要安裝 xmlschema 函式庫:

pip install xmlschema

然後,可以使用以下程式碼來解析和驗證 XML 檔案:

from xmlschema import XMLSchema

# 定義 XML Schema
schema = """
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="place" type="xs:string"/>
  <xs:element name="li">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="place"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
"""

# 載入 Schema
xsd_schema = XMLSchema(schema)

# 範例 XML 檔案
xml_example = """
<li>
  <place>某地</place>
</li>
"""

# 驗證 XML 檔案
try:
    xsd_schema.validate(xml_example)
    print("XML 檔案透過驗證")
except Exception as e:
    print(f"XML 檔案未透過驗證:{e}")

圖表翻譯

  graph LR
    A[XML Schema] --> B[定義 li 元素]
    B --> C[指定複合型別]
    C --> D[定義序列]
    D --> E[參照 place 元素]
    E --> F[Python 解析和驗證]
    F --> G[輸出驗證結果]

圖表翻譯

上述 Mermaid 圖表展示了從定義 XML Schema 到使用 Python 驗證 XML 檔案的過程。每一步驟都對應到 XML Schema 的一個方面,從定義 li 元素,指定其為複合型別,到定義序列和參照 place 元素,最後使用 Python 程式碼來解析和驗證 XML 檔案。

XML Schema 中的複雜型別:place 元素

在 XML Schema 中,place 元素被定義為一個複雜型別(complexType),用於描述地理位置或其他形式的位置。下面是 place 元素的詳細定義:

place 元素結構

<xs:element name="place">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:NCName">
        <xs:attribute name="qid" use="required" type="xs:NCName"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

屬性解釋

  • name="place":定義元素的名稱為 place
  • xs:complexType:指定 place 元素是一個複雜型別。
  • xs:simpleContent:指示此元素包含簡單內容,可以是文字或空。
  • xs:extension base="xs:NCName":擴充套件 xs:NCName 型別,新增額外的屬性。xs:NCName 代表一個非空的名稱(不含冒號),用於限制內容的格式。
  • xs:attribute name="qid" use="required" type="xs:NCName":定義一個名為 qid 的屬性,這個屬性是必需的(use=“required”),且其型別也是 xs:NCName。這個屬性可能用於唯一標識某個地理位置或其他形式的位置。

示例

<place qid="LOC001">紐約</place>

在這個示例中,place 元素包含文字內容 “紐約”,並具有 qid 屬性,其值為 “LOC001”,用於標識這個位置。

XML 檔案驗證和解析

XML(Extensible Markup Language)是一種用於標記和交換資料的標記語言。它被廣泛用於各種應用中,包括資料交換、檔案編寫和組態檔案。為了確保 XML 檔案的正確性和一致性,需要進行驗證和解析。

XML 檔案驗證

XML 檔案驗證是指檢查 XML 檔案是否符合一定的規則和約束,例如 XML 標準、XML 模式(Schema)等。驗證的目的是確保 XML 檔案的正確性和一致性,以避免解析錯誤和資料損壞。

有一種常用的驗證工具是 xmlschema 包,它可以用於驗證 XML 檔案是否符合特定的 XML 模式。以下是使用 xmlschema 包進行驗證的例子:

import xmlschema

schema = xmlschema.XMLSchema('places.xsd')
print(schema.validate('places.xml'))

如果 XML 檔案符合模式,則傳回 None,否則傳回錯誤訊息。

XML 檔案解析

XML 檔案解析是指將 XML 檔案轉換為可供程式使用的資料結構。有兩種主要的解析方法:SAX(Simple API for XML)和 DOM(Document Object Model)。

SAX

SAX 是一種事件驅動的解析方法,它將 XML 檔案視為一系列事件,例如開始元素、結束元素、字元等。程式可以定義自己的事件處理器來處理這些事件。

以下是使用 SAX 進行解析的例子:

import xml.sax

class PlaceHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.print = False

    def startElement(self, tagName, attrs):
        if tagName == 'place':
            self.print = True

    def endElement(self, tagName):
        if tagName == 'place':
            self.print = False

    def characters(self, content):
        if self.print:
            print(content)

handler = PlaceHandler()
parser = xml.sax.make_parser()
parser.setContentHandler(handler)
parser.parse('places.xml')

DOM

DOM 是一種樹狀結構的解析方法,它將 XML 檔案轉換為一棵樹,程式可以遍歷和操作這棵樹。

DOM 的優點是可以隨時存取任意節點,但它需要更多的記憶體和計算資源。

處理XML檔案中的地點資訊

在處理XML檔案時,經常需要提取特定的資訊,例如地點。以下是一個簡單的範例,展示如何使用Python的xml.sax模組來解析XML檔案,並提取地點資訊。

XML檔案結構

假設我們有一個XML檔案,包含地點資訊,如下所示:

<root>
    <place qid="Q123">紐約</place>
    <place qid="Q456">倫敦</place>
    <place qid="Q789">東京</place>
</root>

解析XML檔案

我們可以使用xml.sax模組來解析這個XML檔案。首先,定義一個類別PlaceHandler,繼承自xml.sax.ContentHandler

import xml.sax

class PlaceHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.print = False
        self.store_qid = None

    def startElement(self, tagName, attrs):
        if tagName == 'place':
            self.store_qid = attrs['qid']
            self.print = True

    def endElement(self, tagName):
        if tagName == 'place':
            self.print = False

    def characters(self, chars):
        if self.print:
            print(chars + ' (' + self.store_qid + ')')

執行解析

然後,定義一個main函式,負責執行解析:

def main():
    parser = xml.sax.make_parser()
    handler = PlaceHandler()
    parser.setContentHandler(handler)
    parser.parse('example.xml')

執行結果

執行main函式後,將會輸出:

紐約 (Q123)
倫敦 (Q456)
東京 (Q789)

這個範例展示瞭如何使用Python的xml.sax模組來解析XML檔案,並提取地點資訊。

圖表翻譯:

  flowchart TD
    A[開始] --> B[解析XML檔案]
    B --> C[提取地點資訊]
    C --> D[輸出結果]
    D --> E[結束]

內容解密:

  • PlaceHandler類別負責處理XML檔案中的地點資訊。
  • startElement方法用於處理元素開始標籤,當遇到place元素時,設定print旗標為True,並儲存qid屬性值。
  • endElement方法用於處理元素結束標籤,當遇到place元素時,設定print旗標為False
  • characters方法用於處理元素內容,當print旗標為True時,輸出地點名稱和對應的qid值。
  • main函式負責執行解析,建立一個PlaceHandler例項,設定為解析器的內容處理器,並解析指定的XML檔案。

XML 處理與 XPath

SAX 解析器

SAX(Simple API for XML)是一種用於解析XML檔案的API。它是一種事件驅動的API,當解析器遇到XML檔案中的元素時,會觸發相應的事件。以下是一個使用SAX解析器解析XML檔案的例子:

import xml.sax

class CustomContentHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.place_name = ""
        self.qid = ""
        self.is_place = False

    def startElement(self, name, attrs):
        if name == "place":
            self.is_place = True
            self.qid = attrs.get("qid", "")

    def endElement(self, name):
        if name == "place":
            self.is_place = False
            print(f"Place Name: {self.place_name}, QID: {self.qid}")
        elif name == "name" and self.is_place:
            self.place_name = ""

    def characters(self, content):
        if self.is_place:
            self.place_name += content

handler = CustomContentHandler()
xml.sax.parse('places.xml', handler)

在這個例子中,我們定義了一個CustomContentHandler類,該類繼承自xml.sax.ContentHandler。我們覆寫了startElementendElementcharacters方法,以處理XML檔案中的元素和內容。

XPath

XPath是一種用於查詢和存取XML檔案中節點的語言。它的語法與Unix路徑類似,使用斜線 / 分隔父子元素。以下是一個使用XPath查詢XML檔案的例子:

from lxml import etree

tree = etree.parse('places.xml')
root = tree.getroot()

# 查詢第二個place元素的qid屬性
qid = root.xpath('//statement/ul/li[2]/place/@qid')
print(qid)

在這個例子中,我們使用lxml函式庫解析XML檔案,並使用XPath查詢第二個place元素的qid屬性。

TEI

TEI(Text Encoding Initiative)是一種用於編碼和交換文字資料的標準。它提供了一種標準化的方式來表示文字資料,包括結構、語言和格式等資訊。TEI常用於數字人文學和文字分析等領域。

在下一節中,我們將介紹如何使用Python處理TEI檔案。

XPath 與 DOM 的應用

XPath 查詢語言

XPath 是一種用於查詢 XML 檔案的語言,它允許您根據元素的位置、屬性和內容進行查詢。以下是一個簡單的 XPath 查詢範例:

//statement/ul/li[2][substring(place/text(),1,1)="S"]/place/@qid

這個查詢陳述式查詢 statement 元素下的第二個 li 元素,如果其 place 元素的文字內容以 “S” 開頭,則傳回其 qid 屬性。

DOM(Document Object Model)

DOM 是一種對 XML 檔案的物件模型表示法,它允許您使用程式語言操作 XML 檔案。以下是一個使用 Python 的 lxml 套件進行 DOM 操作的範例:

from lxml import etree

# 載入 XML 檔案
tree = etree.parse("example.xml")

# 查詢所有 li 元素
li_elements = tree.xpath("//statement/ul/li")

# 查詢第二個 li 元素,如果其 place 元素的文字內容以 "S" 開頭
second_li = [li for li in li_elements if li.xpath("place/text()")[0].startswith("S")][1]

# 傳回其 qid 屬性
qid = second_li.xpath("place/@qid")[0]

print(qid)

這個範例使用 lxml 套件載入 XML 檔案,然後使用 XPath 查詢陳述式查詢所有 li 元素。接著,它使用列表推導式查詢第二個 li 元素,如果其 place 元素的文字內容以 “S” 開頭。最後,它傳回其 qid 屬性。

結合 XPath 和 DOM

XPath 和 DOM 可以結合使用,以便更方便地操作 XML 檔案。以下是一個範例:

from lxml import etree

# 載入 XML 檔案
tree = etree.parse("example.xml")

# 使用 XPath 查詢陳述式查詢所有 li 元素
li_elements = tree.xpath("//statement/ul/li")

# 使用 DOM 操作每個 li 元素
for li in li_elements:
    # 查詢其 place 元素的文字內容
    place_text = li.xpath("place/text()")[0]
    
    # 如果其 place 元素的文字內容以 "S" 開頭
    if place_text.startswith("S"):
        # 傳回其 qid 屬性
        qid = li.xpath("place/@qid")[0]
        print(qid)

這個範例使用 XPath 查詢陳述式查詢所有 li 元素,然後使用 DOM 操作每個 li 元素。它查詢每個 li 元素的 place 元素的文字內容,如果其以 “S” 開頭,則傳回其 qid 屬性。

圖表翻譯:

  graph LR
    A[載入 XML 檔案] --> B[使用 XPath 查詢陳述式]
    B --> C[查詢 li 元素]
    C --> D[使用 DOM 操作 li 元素]
    D --> E[傳回 qid 屬性]

這個圖表展示了使用 XPath 和 DOM 結合操作 XML 檔案的流程。首先,載入 XML 檔案,然後使用 XPath 查詢陳述式查詢所有 li 元素。接著,使用 DOM 操作每個 li 元素,查詢其 place 元素的文字內容。如果其以 “S” 開頭,則傳回其 qid 屬性。

XML、TEI 和 CDL 概述

XML(Extensible Markup Language)是一種用於標記和交換資料的標記語言。TEI(Text Encoding Initiative)是一種根據 XML 的資料格式,專門用於編碼各種文字,包括語言語料函式庫、詩歌、演出文字、轉錄、詞典、雙語文字等。TEI 的目的是為了提供一個標準化的方式來表示和交換文字資料。

TEI 的檔案非常龐大,截至 2023 年 5 月,檔案長達 2033 頁,包含了大量的技術細節和示例。TEI 不僅是一種單一的 XML 模式,而是一個包含多個模式和的集合,用於編碼不同型別的文字資料。

TEI 的應用

TEI 在各個領域中都有廣泛的應用,包括:

  • 語言語料函式庫:TEI 用於編碼大型語言語料函式庫,如英國國家語料函式庫(British National Corpus)和牛津文字檔案館(Oxford Text Archive)。
  • 古典文字:TEI 用於編碼古典文字,如希臘和拉丁文字。
  • 紀錄和紙莎草文:TEI 用於編碼紀錄和紙莎草文,如埃皮多克(Epidoc)專案。
  • NLP 專注的語料函式庫:TEI 用於編碼 NLP 專注的語料函式庫,如布朗語料函式庫(Brown Corpus)和蘭卡斯特-奧斯陸/卑爾根語料函式庫(Lancaster-Oslo/Bergen Corpus)。

TEI 的優點

TEI 的優點包括:

  • 標準化:TEI 提供了一種標準化的方式來表示和交換文字資料。
  • 靈活性:TEI 可以用於編碼各種型別的文字資料。
  • 廣泛的應用:TEI 在各個領域中都有廣泛的應用。

TEI 的挑戰

TEI 的挑戰包括:

  • 複雜性:TEI 的檔案非常龐大和複雜。
  • 學習曲線:TEI 需要一定的學習曲線來掌握其語法和應用。
內容解密:

上述內容介紹了 TEI 的基本概念、應用、優點和挑戰。TEI 是一種根據 XML 的資料格式,專門用於編碼各種文字。其目的是為了提供一個標準化的方式來表示和交換文字資料。TEI 的檔案非常龐大,包含了大量的技術細節和示例。TEI 在各個領域中都有廣泛的應用,包括語言語料函式庫、古典文字、紀錄和紙莎草文、NLP 專注的語料函式庫等。TEI 的優點包括標準化、靈活性和廣泛的應用。然而,TEI 的複雜性和學習曲線也需要使用者進行一定的投資來掌握其語法和應用。

圖表翻譯:

  graph LR
    A[TEI] --> B[XML]
    B --> C[標準化]
    C --> D[靈活性]
    D --> E[廣泛的應用]
    E --> F[語言語料函式庫]
    F --> G[古典文字]
    G --> H[紀錄和紙莎草文]
    H --> I[NLP 專注的語料函式庫]

此圖表展示了 TEI 的基本概念和其與其他技術的關係。TEI 根據 XML,具有標準化、靈活性和廣泛的應用。TEI 在各個領域中都有廣泛的應用,包括語言語料函式庫、古典文字、紀錄和紙莎草文、NLP 專注的語料函式庫等。

TEI 檔案的結構與要素

TEI(Text Encoding Initiative)是一種用於編碼和標記數字文字的標準。它提供了一種靈活的方式來描述文字的結構和內容,使得文字可以被更容易地儲存、查詢和分析。

TEI 檔案的基本結構

TEI 檔案的基本結構包括一個 TEI 元素,這是檔案的根元素。TEI 元素包含兩個主要的子元素:teiHeadertext

  • teiHeader 元素包含了檔案的後設資料,例如檔案的標題、作者、出版資訊等。
  • text 元素包含了檔案的實際內容。

從技術架構視角來看,本文深入淺出地介紹了 XML、XML Schema、TEI 和相關技術,涵蓋了元素、複合型別、屬性、驗證、解析以及 XPath 等關鍵概念。分析段落清晰地闡述了 XML Schema 如何定義 XML 檔案的結構,並輔以 Python 程式碼示例,展現瞭如何在實際應用中驗證和解析 XML 檔案。同時,文章也點明瞭 TEI 的複雜性,以及學習曲線較陡峭的挑戰。文章也討論了 SAX 和 DOM 兩種不同的 XML 解析方法,並比較了它們的優缺點,以及如何結合 XPath 進行更高效的 XML 資料提取。然而,文章缺乏對不同 XML 處理技術的效能比較,例如 SAX 和 DOM 在處理大規模 XML 檔案時的效能差異。展望未來,隨著資料交換需求的日益增長,XML 技術仍將扮演重要角色,而 TEI 等更專業的 XML 應用也將持續發展。對於需要處理大量文字資料的研究者和開發者來說,深入理解 TEI 的結構和使用方法至關重要。玄貓認為,掌握 XML 和相關技術對於提升資料處理能力和效率至關重要,值得技術人員投入時間學習和研究。