当 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 文档中的节点、内容和值。