将对象层次结构映射到 XML 数据

当 XML 文档位于内存中时,概念表示形式为树。 对于编程,你有一个对象层次结构来访问树的节点。 以下示例演示 XML 内容如何成为节点。

当 XML 读入 XML 文档对象模型(DOM)时,这些片段将转换为节点,并且这些节点会保留有关自身的其他元数据,例如节点类型和值。 节点类型是其对象,确定可以执行的作以及可以设置或检索哪些属性。

如果你有以下简单的 XML:

输入

<book>  
    <title>The Handmaid's Tale</title>  
</book>  

输入在内存中表示为具有分配的节点类型属性的以下节点树:

示例节点树
book 和 title 节点树表示形式

元素 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 文档 -> 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
<!--此元素中的十四个字符。--> <--此元素中的十四个字符。--> XmlNodeType.Comment
<项> <项> XmlNodeType.Element
1234567890ABCD 1234567890ABCD XmlNodeType.Text
</项目> </项目> XmlNodeType.EndElement
</项目> </项目> XmlNodeType.EndElement

必须知道分配的节点类型,因为节点类型控制哪些操作是有效的,以及你可以设置和检索哪些属性。

当数据通过 PreserveWhitespace 标志加载到 DOM 时,可以控制为空格创建节点。 有关详细信息,请参阅 加载 DOM 时的空白和重要的空白处理

若要向 DOM 添加新节点,请参阅 将节点插入 XML 文档。 若要从 DOM 中删除节点,请参阅 从 XML 文档中删除节点、内容和值。 若要修改 DOM 中节点的内容,请参阅 修改 XML 文档中的节点、内容和值

另请参阅