共用方式為


LINQ to XML 比較DOM

本文說明 LINQ to XML 與目前主要 XML 程式設計 API、W3C 檔案物件模型 (DOM) 之間的一些主要差異。

建構 XML 樹狀結構的新方式

在 W3C DOM 中,您會從上到下建置 XML 樹狀結構;也就是說,您要建立檔、建立元素,然後將元素新增至檔。

例如,下列範例使用一般方式,使用 DOM XmlDocument的Microsoft實作來建立 XML 樹狀結構。

XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
XmlElement phone1 = doc.CreateElement("Phone");
phone1.SetAttribute("Type", "Home");
phone1.InnerText = "206-555-0144";
XmlElement phone2 = doc.CreateElement("Phone");
phone2.SetAttribute("Type", "Work");
phone2.InnerText = "425-555-0145";
XmlElement street1 = doc.CreateElement("Street1");
street1.InnerText = "123 Main St";
XmlElement city = doc.CreateElement("City");
city.InnerText = "Mercer Island";
XmlElement state = doc.CreateElement("State");
state.InnerText = "WA";
XmlElement postal = doc.CreateElement("Postal");
postal.InnerText = "68042";
XmlElement address = doc.CreateElement("Address");
address.AppendChild(street1);
address.AppendChild(city);
address.AppendChild(state);
address.AppendChild(postal);
XmlElement contact = doc.CreateElement("Contact");
contact.AppendChild(name);
contact.AppendChild(phone1);
contact.AppendChild(phone2);
contact.AppendChild(address);
XmlElement contacts = doc.CreateElement("Contacts");
contacts.AppendChild(contact);
doc.AppendChild(contacts);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
Dim phone1 As XmlElement = doc.CreateElement("Phone")
phone1.SetAttribute("Type", "Home")
phone1.InnerText = "206-555-0144"
Dim phone2 As XmlElement = doc.CreateElement("Phone")
phone2.SetAttribute("Type", "Work")
phone2.InnerText = "425-555-0145"
Dim street1 As XmlElement = doc.CreateElement("Street1")
street1.InnerText = "123 Main St"
Dim city As XmlElement = doc.CreateElement("City")
city.InnerText = "Mercer Island"
Dim state As XmlElement = doc.CreateElement("State")
state.InnerText = "WA"
Dim postal As XmlElement = doc.CreateElement("Postal")
postal.InnerText = "68042"
Dim address As XmlElement = doc.CreateElement("Address")
address.AppendChild(street1)
address.AppendChild(city)
address.AppendChild(state)
address.AppendChild(postal)
Dim contact As XmlElement = doc.CreateElement("Contact")
contact.AppendChild(name)
contact.AppendChild(phone1)
contact.AppendChild(phone2)
contact.AppendChild(address)
Dim contacts As XmlElement = doc.CreateElement("Contacts")
contacts.AppendChild(contact)
doc.AppendChild(contacts)
Console.WriteLine(doc.OuterXml)

此程式代碼撰寫樣式會隱藏 XML 樹狀結構。 LINQ to XML 也支援替代方法 、功能建構,更能顯示結構。 此方法可以使用 XElementXAttribute 建構函式來完成。 在 Visual Basic 中,也可以使用 XML 常值來完成。 此範例示範使用功能建構來建構相同的 XML 樹狀結構:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144",
                new XAttribute("Type", "Home")),
            new XElement("phone", "425-555-0145",
                new XAttribute("Type", "Work")),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Dim contacts = _
    <Contacts>
        <Contact>
            <Name>Patrick Hines</Name>
            <Phone Type="Home">206-555-0144</Phone>
            <Phone Type="Work">425-555-0145</Phone>
            <Address>
                <Street1>123 Main St</Street1>
                <City>Mercer Island</City>
                <State>WA</State>
                <Postal>68042</Postal>
            </Address>
        </Contact>
    </Contacts>

請注意,縮排程式代碼以建構 XML 樹狀結構會顯示基礎 XML 的結構。 Visual Basic 版本使用 XML 常值。

如需詳細資訊,請參閱 XML 樹狀結構

直接使用 XML 元素

當您使用 XML 進行程式設計時,主要焦點通常是在 XML 元素上,或許是在屬性上。 在 LINQ to XML 中,您可以直接使用 XML 元素和屬性。 例如,您可以執行下列動作:

  • 完全不使用文件物件來建立 XML 元素。 當您必須使用 XML 樹狀結構片段時,這會簡化程序設計。
  • 直接從 XML 檔案載入 T:System.Xml.Linq.XElement 物件。
  • T:System.Xml.Linq.XElement 物件序列化到檔案或數據流。

將此與 W3C DOM 進行比較,其中 XML 檔會作為 XML 樹狀結構的邏輯容器。 在 DOM 中,XML 節點,包括元素和屬性,必須在 XML 檔的內容中建立。 以下是在 DOM 中建立名稱元素的程式代碼片段:

XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
doc.AppendChild(name);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
doc.AppendChild(name)

如果您想要跨多個檔使用元素,則必須跨檔匯入節點。 LINQ to XML 可避免這種複雜度。

使用 LINQ to XML 時,只有在您想要在檔的根層級新增批注或處理指令時,才會使用 XDocument 類別。

簡化名稱和命名空間的處理

處理名稱、命名空間和命名空間前置詞通常是 XML 程式設計的複雜部分。 LINQ to XML 可藉由消除處理命名空間前置詞的需求來簡化名稱和命名空間。 如果您想要控制命名空間前置詞,您可以。 但是,如果您決定不明確控制命名空間前置詞,則如果需要,LINQ to XML 會在串行化期間指派命名空間前置詞,或者如果不是,則會使用預設命名空間串行化。 如果使用預設命名空間,則產生的檔中不會有命名空間前置詞。 如需詳細資訊,請參閱 命名空間概觀

DOM 的另一個問題是它不會讓您變更節點的名稱。 相反地,您必須建立新的節點,並將所有子節點複製到該節點,並遺失原始節點身分識別。 LINQ to XML 可讓您在節點上設定 XName 屬性,以避免這個問題。

載入 XML 的靜態方法支援

LINQ to XML 可讓您使用靜態方法來載入 XML,而不是實例方法。 這可簡化載入和剖析。 如需詳細資訊,請參閱 如何從檔案載入 XML

取消對 DTD 結構的支援

LINQ to XML 藉由移除實體和實體參考的支持,進一步簡化 XML 程式設計。 實體的管理很複雜,而且很少使用。 拿掉其支援會增加效能,並簡化程式設計介面。 填入 LINQ to XML 樹狀結構時,會展開所有 DTD 實體。

對片段的支援

LINQ to XML 不提供 對等 XmlDocumentFragment 的 類別。 不過,在許多情況下, XmlDocumentFragment 概念可以透過類型為 IEnumerable<T>XNodeIEnumerable<T>XElement的查詢結果來處理。

支援 XPathNavigator 功能

LINQ to XML 透過XPathNavigator命名空間中的擴充方法提供對System.Xml.XPath的支援。 如需詳細資訊,請參閱System.Xml.XPath.Extensions

支援空白和縮排

LINQ to XML 會比 DOM 更簡單地處理空格符。

常見的案例是讀取縮排 XML、建立記憶體內部 XML 樹狀結構,而沒有任何空格符文字節點(也就是不保留空格符)、對 XML 執行一些作業,然後使用縮排儲存 XML。 當您使用格式串行化 XML 時,只會保留 XML 樹狀結構中的顯著空格符。 這是 LINQ to XML 的預設行為。

另一個常見案例是讀取和修改已經刻意縮排的 XML。 您可能不希望以任何方式更改這個縮排。 在 LINQ to XML 中,您可以執行下列動作:

  • 載入或剖析 XML 時保留空格符。
  • 當您序列化 XML 時停用格式化。

LINQ to XML 會將空格符儲存為 XText 節點,而不是像 DOM 一樣具有特製化的 Whitespace 節點類型。

註釋支持

LINQ to XML 元素支援一組可延伸的註釋。 這適用於追蹤有關元素的雜項資訊,例如架構資訊、元素是否綁定到使用者介面的相關資訊,或任何其他應用程式特定資訊。 如需詳細資訊,請參閱 LINQ to XML 批注

支援架構資訊

LINQ to XML 透過命名空間中的 System.Xml.Schema 擴充方法,提供 XSD 驗證的支援。 您可以驗證 XML 樹狀結構是否符合 XSD。 您可以使用結構後驗證資訊集(PSVI)來填充 XML 樹狀結構。 如需詳細資訊,請參閱 如何使用 XSDExtensions進行驗證。

另請參閱