就地修改 XML 樹狀結構是變更 XML 檔形狀的傳統方法。 一般應用程式會將檔載入至資料存放區,例如 DOM 或 LINQ to XML;使用程式設計介面來插入或刪除節點,或變更其內容;然後將 XML 儲存至檔案,或透過網路傳輸它。
LINQ to XML 可讓其他方法在許多案例中很有用: 功能建構。 函數式構造會將修改資料處理為轉換問題,而不是詳細處理數據存放區。 如果您可以取得數據的表現形式,並有效地從一種形式轉換至另一種形式,則結果就如同您對一個數據庫進行操作,使其轉變為另一種形狀的效果相同。 功能建構方法的關鍵是將查詢 XDocument 的結果傳遞給 和 XElement 建構函式。
在許多情況下,您可以在比操作數據存儲區少得多的時間內撰寫轉換程式碼,這樣產生的程式碼更為強固且更易於維護。 在這些情況下,即使轉換方法可以採用更強大的處理能力,但這是修改數據更有效率的方式。 如果開發人員熟悉功能方法,則在許多情況下產生的程序代碼更容易理解,而且很容易找到修改樹狀結構每個部分的程序代碼。
您就地修改 XML 樹狀結構的方法對許多 DOM 程式設計人員來說比較熟悉,而使用功能方法撰寫的程式代碼對尚未瞭解該方法的開發人員來說,看起來可能不熟悉。 如果您只需要對大型 XML 樹狀結構進行小型修改,在許多情況下,修改樹狀結構的方法會花費較少的 CPU 時間。
本文提供這兩種方法的範例。 假設您想要修改下列簡單的 XML 檔,讓屬性成為元素:
<?xml version="1.0" encoding="utf-8" ?>
<Root Data1="123" Data2="456">
<Child1>Content</Child1>
</Root>
下列第一個範例使用傳統的就地修改方法,第二個範例使用功能建構方法。
範例:使用傳統的原地方法將屬性轉換成元素
您可以撰寫一些程式代碼,從屬性建立元素,然後刪除屬性,如下所示:
XElement root = XElement.Load("Data.xml");
foreach (XAttribute att in root.Attributes()) {
root.Add(new XElement(att.Name, (string)att));
}
root.Attributes().Remove();
Console.WriteLine(root);
Dim root As XElement = XElement.Load("Data.xml")
For Each att As XAttribute In root.Attributes()
root.Add(New XElement(att.Name, att.Value))
Next
root.Attributes().Remove()
Console.WriteLine(root)
此範例會產生下列輸出:
<Root>
<Child1>Content</Child1>
<Data1>123</Data1>
<Data2>456</Data2>
</Root>
範例:使用功能建構方法將屬性轉換成元素
相較之下,功能方法是由程式代碼組成新樹狀結構、從來源樹狀結構挑選及選擇元素和屬性,並在新增至新樹狀結構時適當地轉換它們。
XElement root = XElement.Load("Data.xml");
XElement newTree = new XElement("Root",
root.Element("Child1"),
from att in root.Attributes()
select new XElement(att.Name, (string)att)
);
Console.WriteLine(newTree);
Dim root As XElement = XElement.Load("Data.xml")
Dim newTree As XElement = _
<Root>
<%= root.<Child1> %>
<%= From att In root.Attributes() _
Select New XElement(att.Name, att.Value) %>
</Root>
Console.WriteLine(newTree)
本範例會輸出與第一個範例相同的 XML。 不過,請注意,在功能方法中,您實際上可以看到新 XML 的結果結構。 您可以看到Root元素的創建、從來源樹中提取Child1元素的代碼,以及將來源樹中的屬性轉換為新樹中元素的代碼。
在此案例中,功能範例既不是比第一個範例短,也不是更簡單。 不過,如果您有對 XML 樹狀結構進行許多變更,程式方法將會變得相當複雜且有些模糊。 相反地,使用功能方法時,您仍然只會形成所需的 XML、適當地內嵌查詢和表達式,以提取所需的內容。 功能方法會產生更容易維護的程序代碼。
請注意,在此情況下,函數式方法的效能可能不如樹操作方法。 主要問題是函數式方法會建立更多更短暫的物件。 不過,如果使用函數方法可以提高程式設計人員的生產力,這樣的取捨就是有效的。
這是一個非常簡單的範例,但它有助於顯示兩種方法之間的哲學差異。 功能方法會產生更大的生產力提升,以轉換較大的 XML 檔。