使用文档对象模型(DOM:Document object Module)
以下内容来自msdn: XML 文档对象模型 (DOM)
文档对象模型 (DOM) 类是 XML 文档的内存中表示形式。DOM 使您能够以编程方式读取、操作和修改 XML 文档。XmlReader 类也读取 XML,但它提供非缓存的只进、只读访问。这意味着使用 XmlReader 无法编辑属性值或元素内容,或无法插入和移除节点。编辑是 DOM 的主要功能。XML 数据在内存中表示是常见的结构化方法,尽管实际的 XML 数据在文件中时或从另一个对象传入时以线性方式存储。以下是 XML 数据。
输入
下图显示将此 XML 数据读入 DOM 结构中时内存的构造。
在 XML 文档结构中,此图中的每个圆圈表示一个节点(称为 XmlNode 对象)。XmlNode 对象是 DOM 树中的基本对象。XmlDocument 类(它扩展 XmlNode)支持用于对整个文档执行操作(例如,将文档加载到内存中或将 XML 保存到文件)的方法。此外,XmlDocument 提供了查看和操作整个 XML 文档中的节点的方法。XmlNode 和 XmlDocument 都具有性能和可用性增强,并具有进行下列操作的方法和属性:
访问和修改特定于 DOM 的节点,如元素节点、实体引用节点等。
除检索节点包含的信息(如元素节点中的文本)外,还检索全部节点。
注意 如果应用程序不需要 DOM 提供的结构或编辑功能,则 XmlReader 和 XmlWriter 类提供对 XML 的非缓存的只进流访问。有关更多信息,请参见用 XmlReader 读取 XML 和用 XmlWriter 编写 XML。
以上是对DOM的初步了解
DOM 的一个特性是它处理属性的方式。属性是不属于父子关系和同辈关系的节点。属性被视为元素节点的属性,由名称和值对组成。例如,如果存在由与元素 price 关联的 format="dollar" 组成的 XML 数据,则单词 format 是名称,format 属性的值是 dollar。为检索 price 节点的 format="dollar" 属性,可以在游标位于 price 元素节点时调用 GetAttribute。有关更多信息,请参见访问 DOM 中的属性。
将 XML 读入内存时会创建节点。然而,并非所有节点都是同一类型。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 用作输入:
输入
下面的代码示例读取 items.xml 文件并显示每个节点类型的信息。
此示例的输出显示数据到节点类型的映射。
输出
<?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 Items [<!ENTITY number "123">]> <!DOCTYPE Items [<!ENTITY number "123">] XmlNodeType.DocumentType
<Items> <Items> XmlNodeType.Element
<Item> <Item> XmlNodeType.Element
Test with an entity: &number;</Item> Test with an entity: 123 XmlNodeType.Text
</Item> </Item> XmlNodeType.EndElement
<Item> <Item> XmNodeType.Element
test with a child element test with a child element XmlNodeType.Text
<more> <more> XmlNodeType.Element
stuff stuff XmlNodeType.Text
</Item> </Item> XmlNodeType.EndElement
<Item> <Item> XmlNodeType.Element
test with a CDATA section test with a CDATA section XmlTest.Text
<![CDATA[<456>]]> <![CDATA[<456>]]> XmlTest.CDATA
def def XmlNodeType.Text
</Item> </Item> XmlNodeType.EndElement
<Item> <Item> XmlNodeType.Element
Test with a char entity: A Test with a char entity: 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
您必须知道分配的节点类型,因为节点类型控制哪种操作有效,以及可以设置和检索哪种属性。
当将数据加载到 DOM 中时,空白的节点创建受 PreserveWhitespace 标志的控制。有关更多信息,请参见加载 DOM 时的空白和有效空白处理。
下图显示了 DOM 的类层次结构,其中 W3C 名称用括号括起来,另外还有它们的相关类名。
将XML文档加载到DOM中
要将Xml文件加载到内存里面可以使用XmlDocument类的Load方法,入下所示:
XmlDocument myDoc=new XmlDocument();
myDoc.Load(@"books.xml");
DOM 是 XML 文档的内存中(缓存)树状表示形式,允许对该文档的导航和编辑。
XmlDataDocument 类对 XmlDocument 进行扩展,允许通过关系 DataSet 存储、检索和操作结构化数据。该类允许各组件将 XML 和基础数据的关系视图混合在一起。
例如:
[C#] 该示例使用文件 books.xml 作为输入。
XmlDocument.LoadXml 方法 从指定的字符串加载 XML 文档。
格式:
public virtual void LoadXml(
string xml
);
示例:
一旦将XML文档加载到内存中以后,就可以开始使用存储在文档中的信息
通过已经创建的XmlDocument对象可以访问所有的元素.
在XmlDocument对象中,可以使用DocumentElement属性访问根结点。在根结点那里,可以使用ChildNodes数组访问每个结点和子结点
尽管访问根结点与访问子结点(使用DocumentElement属性,而不是ChildNodes数组)不同,但是这两个情况中所用属性和方法本质是相同的.因为他们都是XmlNode对象类型
注意看看区别:
...
XmlDocument myDoc=new XmlDocument();
myDoc.LoadXml("<?xml version='1.0'?>"+"<Video><Title>Gone with the wind</Title>"+"<rating>PG</rating></Video>");
Console.WriteLine(myDoc.DocumentElement.OuterXml);
//输出结果是<Video><Title>Gone with the wind</Title><rating>PG</rating></Video>
或者
Console.WriteLine(myDoc.DocumentElement.InnerXml);
//输出结果是<Title>Gone with the wind</Title><rating>PG</rating>
...
使用OuterXml属性,将返回所有的XML,包括当前结点.
如果想要当前所有的XML,但是却不想要这个元素,可以使用InnerXml属性。
从DOM保存文件
修改以后要保存他们XmlDocument对象存储在内存中。想要修改,就必须要保存XmlDocument对象。可以使用Save方法更新文件。
除了分配文件名或者URL之外, 还可以保存到XmlWriter对象,TextWriter对象或者流中.
待续
浙公网安备 33010602011771号