當 XML 檔位於記憶體中時,概念表示法是樹狀結構。 針對程式設計,您有物件階層可存取樹狀結構的節點。 下列範例示範 XML 內容如何變成節點。
當 XML 讀入 XML 檔案物件模型 (DOM),片段會轉譯成節點,而且這些節點會保留本身的其他元數據,例如其節點類型和值。 節點類型是其物件,其決定可執行哪些動作,以及可以設定或擷取哪些屬性。
如果您有下列簡單的 XML:
輸入
<book>
<title>The Handmaid's Tale</title>
</book>
輸入於記憶體中表示為以下樹狀結構的節點,並已指派節點類型屬性。
書籍與標題的節點樹結構表述
元素 book 會變成 XmlElement 物件,下一 title個專案,也會變成 XmlElement,而元素內容會變成 XmlText 物件。 在查看 XmlElement 方法和屬性時,方法和屬性與 XmlText 物件上可用的方法和屬性不同。 因此,知道 XML 標記會變成哪個節點類型非常重要,因為它的節點類型會決定可執行的動作。
下列範例會讀取 XML 數據,並根據節點類型寫出不同的文字。 使用下列 XML 資料檔案作為輸入, items.xml:
輸入
<?xml version="1.0"?>
<!-- This is a sample XML document -->
<!DOCTYPE Items [<!ENTITY number "123">]>
<Items>
<Item>Test with an entity: &number;</Item>
<Item>test with a child element <more/> stuff</Item>
<Item>test with a CDATA section <![CDATA[<456>]]> def</Item>
<Item>Test with a char entity: A</Item>
<!-- Fourteen chars in this element.-->
<Item>1234567890ABCD</Item>
</Items>
下列程式代碼範例會讀取 items.xml 檔案,並顯示每個節點類型的資訊。
Imports System
Imports System.IO
Imports System.Xml
Public Class Sample
Private Const filename As String = "items.xml"
Public Shared Sub Main()
Dim reader As XmlTextReader = Nothing
Try
' Load the reader with the data file and
'ignore all white space nodes.
reader = New XmlTextReader(filename)
reader.WhitespaceHandling = WhitespaceHandling.None
' Parse the file and display each of the nodes.
While reader.Read()
Select Case reader.NodeType
Case XmlNodeType.Element
Console.Write("<{0}>", reader.Name)
Case XmlNodeType.Text
Console.Write(reader.Value)
Case XmlNodeType.CDATA
Console.Write("<![CDATA[{0}]]>", reader.Value)
Case XmlNodeType.ProcessingInstruction
Console.Write("<?{0} {1}?>", reader.Name, reader.Value)
Case XmlNodeType.Comment
Console.Write("<!--{0}-->", reader.Value)
Case XmlNodeType.XmlDeclaration
Console.Write("<?xml version='1.0'?>")
Case XmlNodeType.Document
Case XmlNodeType.DocumentType
Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value)
Case XmlNodeType.EntityReference
Console.Write(reader.Name)
Case XmlNodeType.EndElement
Console.Write("</{0}>", reader.Name)
End Select
End While
Finally
If Not (reader Is Nothing) Then
reader.Close()
End If
End Try
End Sub 'Main ' End class
End Class 'Sample
using System;
using System.IO;
using System.Xml;
public class Sample
{
private const String filename = "items.xml";
public static void Main()
{
XmlTextReader reader = null;
try
{
// Load the reader with the data file and ignore
// all white space nodes.
reader = new XmlTextReader(filename);
reader.WhitespaceHandling = WhitespaceHandling.None;
// Parse the file and display each of the nodes.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
Console.Write("<{0}>", reader.Name);
break;
case XmlNodeType.Text:
Console.Write(reader.Value);
break;
case XmlNodeType.CDATA:
Console.Write("<![CDATA[{0}]]>", reader.Value);
break;
case XmlNodeType.ProcessingInstruction:
Console.Write("<?{0} {1}?>", reader.Name, reader.Value);
break;
case XmlNodeType.Comment:
Console.Write("<!--{0}-->", reader.Value);
break;
case XmlNodeType.XmlDeclaration:
Console.Write("<?xml version='1.0'?>");
break;
case XmlNodeType.Document:
break;
case XmlNodeType.DocumentType:
Console.Write("<!DOCTYPE {0} [{1}]", reader.Name, reader.Value);
break;
case XmlNodeType.EntityReference:
Console.Write(reader.Name);
break;
case XmlNodeType.EndElement:
Console.Write("</{0}>", reader.Name);
break;
}
}
}
finally
{
if (reader != null)
reader.Close();
}
}
} // End class
範例的輸出會顯示數據與節點類型的對應。
輸出
<?xml version='1.0'?><!--This is a sample XML document --><!DOCTYPE Items [<!ENTITY number "123">]<Items><Item>Test with an entity: 123</Item><Item>test with a child element <more> stuff</Item><Item>test with a CDATA section <![CDATA[<456>]]> def</Item><Item>Test with a char entity: A</Item><--Fourteen chars in this element.--><Item>1234567890ABCD</Item></Items>
逐行輸入資料,並利用程式碼生成的輸出,您可以使用下表分析哪些節點測試生成了哪些輸出行,從而了解 XML 資料成為何種類型的節點。
| 輸入 | 輸出 | 節點類型測試 |
|---|---|---|
| <?xml version=“1.0”?> | <?xml version='1.0'?> | XmlNodeType.XmlDeclaration(XML宣告) |
| <-- 這是範例 XML 檔案 -> | <--這是 XML 檔案的範例 --> | XmlNodeType.Comment |
| <!DOCTYPE 專案 [<!實體編號 “123”>]> | <!DOCTYPE 專案 [<!實體編號 “123”>] | XmlNodeType.DocumentType |
| <項目> | <項目> | XmlNodeType.Element |
| <項目> | <項目> | XmlNodeType.Element |
| 使用實體進行測試: &number; | 使用實體進行測試:123 | XmlNodeType.Text(節點類型:文本) |
| </項目> | </項目> | XmlNodeType.EndElement |
| <項目> | <項目> | XmNodeType.Element |
| 使用子項目進行測試 | 使用子項目進行測試 | XmlNodeType.Text(節點類型:文本) |
| <更多> | <更多> | XmlNodeType.Element |
| 東西 | 東西 | XmlNodeType.Text(節點類型:文本) |
| </項目> | </項目> | XmlNodeType.EndElement |
| <項目> | <項目> | XmlNodeType.Element |
| 使用 CDATA 區段進行測試 | 使用 CDATA 區段進行測試 | XmlTest.Text |
| <![CDATA[<456>]]> | <![CDATA[<456>]]> | XmlTest.CDATA |
| def | def | XmlNodeType.Text(節點類型:文本) |
| </項目> | </項目> | XmlNodeType.EndElement |
| <項目> | <項目> | XmlNodeType.Element |
| 使用 char 實體進行測試: A | 使用 char 實體進行測試:A | XmlNodeType.Text(節點類型:文本) |
| </項目> | </項目> | XmlNodeType.EndElement |
| <!-- 該元素包含十四個字元。--> | <--此元素中的14个字。--> | XmlNodeType.Comment(XML 節點類型:註解) |
| <項目> | <項目> | XmlNodeType.Element |
| 1234567890ABCD | 1234567890ABCD | XmlNodeType.Text(節點類型:文本) |
| </項目> | </項目> | XmlNodeType.EndElement |
| </項目> | </項目> | XmlNodeType.EndElement(XML 節點類型:結束元素) |
您必須知道指派的節點類型,因為節點類型會控制哪些動作類型有效,以及您可以設定和擷取的屬性類型。
當資料載入到 DOM 並由 PreserveWhitespace 旗標控制時,會控制空白符的節點創建。 如需詳細資訊,請參閱 載入 DOM 時的空格符和重大空格符處理。
若要將新節點新增至 DOM,請參閱 將節點插入 XML 檔中。 若要從 DOM 移除節點,請參閱 從 XML 檔移除節點、內容和值。 若要修改 DOM 中節點的內容,請參閱 修改 XML 檔中的節點、內容和值。