X-DOM概覽
X-DOM的核心類型. XElement是所有這些類型當中最常用的. XObject是整個繼承體系中的根源; XElement和XDocument是整個箱體層級的根.
考察下面的代碼:
1: string XML =
2: @"<customer id='123' status='archived'>
3: <firstname>Joe</firstname>
4: <lastname>Bloggs<!--nice name -></lastname>
5: </customer>";
6:
7: XElement customer = XElement.Parse (XML);
XObject是所有XML內容的抽象基類. 它定義了一個指向父元素的連接以及一個可選的XDocument.
XNode是除開屬性(attributes)之外的多數XML內容的基類. 一個區別就是XNode可以處理一個有序的混合類型的XNode的集合, 考慮下面的XML片段:
1: <data>
2: Hello world
3: <subelement1/>
4: <!--comment-->
5: <subelement2/>
6: </data>
在父元素<data>裡面, 第一個節點是一個XText(Hello world), 接著是一個XElement節點, 然後是一個XComment節點, 最後是另外的一個XElement節點. 相反的, 一個XAttribute只能配對出現.
雖然一個XNode能夠訪問它的父元素, 但它並沒有子節點的概念; 這是它的子類型XContainer的工作. XContainer定義了一些用於處理子節點的成員並且它也是XElement和XDocument的抽象基類.
XElement引入了一些管理attributes的成員例如Name和Value. 對於那種元素只擁有一個單一的XText子節點的情況, Value屬性可以讀取或者設置子節點的內容, 而不再需要不必要的導航. 感謝Value, 大多數情況下你可以避免和XText節點直接打交道.
XDocument表示一棵XML樹的根. 更精確的說, 它包裝了根元素, 增加了一個XDeclaration, 處理指令, 以及其它的根級別的相關操作. 不像W3C DOM, 它的使用是可選的, 你甚至可以在沒有創建XDocument的時候加載, 操作, 或者保存一個X-DOM. 對於XDocument的非依賴意味著你可以高效而簡易的將一個字節點樹移到另外一個X-DOM層級上面.
加載與解析
XElement與XDocument兩者都提供了靜態Load和Parse的方法從一個已存在的數據源中來構建一棵X-DOM樹.
XNode也提供了一個ReadFrom的靜態方法, 該方法實例化來自於XmlReader的任何節點類型. 不像Load, 它讀取了一個節點之後就立即停止, 你可以通過手動讀取XmlReader來繼續進行處理. 另外你也可以反向操作, 使用一個XmlReader(CreateReader)或者XMLWriter(CreateWriter)來讀/寫一個XNode.
例如:
1: XDocument fromWeb = XDocument.Load
2: ("http://albahari.com/sample.XML");
3:
4: XElement fromFile = XElement.Load
5: (@"e:mediasomefile.XML");
6:
7: XElement config = XElement.Parse (
8: @"<configuration>
9: <clIEnt enabled='true'>
10: <timeout>30</timeout>
11: </clIEnt>
12: </configuration>");
保存與序列化
在任何節點上調用ToString都會將其內容轉換成一個XML字符串-該字符串就像我們看到的那樣已經被斷行符格式化過了.(我們還可以在調用ToString的時候指定SaveOptions.DisableFormatting, 這樣將禁用格式化斷行符)
同時XElement和XDocument也提供了一個Save方法用於將一個X-DOM寫入到文件中, TextWriter 或者 XmlWriter. 如果你選擇了使用文件, 那麼XML declaration將會被自動寫入. 另外XNode也包含了一個WriteTo的方法, 其接收一個XMLWriter參數.
待續!