共用方式為


將物件階層對應至 XML 數據

當 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 檔中的節點、內容和值

另請參閱