当 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 文件并显示每个节点类型的信息。
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 |
<!-- This is a sample XML document --> | <!-- This is a sample XML document --> | XmlNodeType.Comment |
<!DOCTYPE Items [<!ENTITY number "123">]> | <!DOCTYPE Items [<!ENTITY number "123">] | XmlNodeType.DocumentType |
<项> | <项> | XmlNodeType.Element |
<Item> | <Item> | XmlNodeType.Element |
与以下实体一起测试: &number;</Item> | 与以下实体一起测试: 123 | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
<Item> | <Item> | XmNodeType.Element |
与子元素一起测试 | 与子元素一起测试 | XmlNodeType.Text |
<more> | <more> | XmlNodeType.Element |
stuff | stuff | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
<Item> | <Item> | XmlNodeType.Element |
与 CDATA 节一起测试 | 与 CDATA 节一起测试 | XmlTest.Text |
<![CDATA[<456>]]> | <![CDATA[<456>]]> | XmlTest.CDATA |
def | def | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
<Item> | <Item> | XmlNodeType.Element |
与字符实体一起测试:A A | 与字符实体一起测试: A | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
<!-- Fourteen chars in this element.--> | <--Fourteen chars in this element.--> | XmlNodeType.Comment |
<Item> | <Item> | XmlNodeType.Element |
1234567890ABCD | 1234567890ABCD | XmlNodeType.Text |
</Item> | </Item> | XmlNodeType.EndElement |
</Items> | </Items> | XmlNodeType.EndElement |
您必须知道分配的节点类型,因为节点类型控制哪些操作有效,以及可以设置和检索哪些属性。