System.Xml 命名空间使用 XmlDocument 或 XPathDocument 类提供内存中 XML 文档、片断、节点或节点集的编程表示形式。
XPathDocument 类使用 XPath 数据模型提供 XML 文档在内存中的快速只读表示形式。XmlDocument 类提供实现 W3C 文档对象模型 (DOM) 级别 1 核心和核心 DOM 级别 2 的 XML 文档在内存中的可编辑表示形式。这两个类均实现 IXPathNavigable 接口,并返回 XPathNavigator 对象,用于选择、计算、浏览和(在某些情况下)编辑基础 XML 数据。
使用 XPathDocument 类读取 XML 文档
XPathDocument 类使用 XPath 数据模型提供 XML 文档在内存中的快速只读表示形式。XPathDocument 类的实例使用其六个构造函数之一创建。通过这些构造函数,可以使用 Stream、TextReader 或 XmlReader 对象以及 XML 文件的 string 路径来读取 XML 文档。
使用 XmlDocument 类读取 XML 文档
XmlDocument 类是实现 W3C 文档对象模型 (DOM) 级别 1 核心和核心 DOM 级别 2 的 XML 文档在内存中的可编辑表示形式。XmlDocument 类的实例使用其三个构造函数之一创建。可以通过调用没有参数的 XmlDocument 类构造函数,创建新的空 XmlDocument 对象。在调用了构造函数之后,使用 Load 方法以及 XML 文件的 string 路径将 XML 数据从 Stream、TextReader 或 XmlReader 对象加载到新的 XmlDocument 对象中。
确定 XML 文档的编码
XmlReader 对象可以用于读取 XML 文档并创建 XPathDocument 和 XmlDocument 对象,如前面各节所示。但是,XmlReader 对象可能会读取未编码的数据,因此,不会提供任何编码信息。
XmlTextReader 类从 XmlReader 类继承,使用其 Encoding 属性提供编码信息,并且可以用于创建 XPathDocument 对象或 XmlDocument 对象。
有关 XmlTextReader 类提供的编码信息的更多信息,请参见 XmlTextReader 类参考文档中的 Encoding 属性。
创建 XPathNavigator 对象
在将 XML 文档读入 XPathDocument 或 XmlDocument 对象之后,可以创建一个 XPathNavigator 对象,以选择、计算、浏览和(在有些情况下)编辑基础 XML 数据。
除了 XmlNode 类之外,XPathDocument 和 XmlDocument 类也实现了 System.Xml.XPath 命名空间的 IXPathNavigable 接口。因此,所有三个类均提供返回 XPathNavigator 对象的 CreateNavigator 方法。
使用 XPathNavigator 类编辑 XML 文档
除了选择、计算和浏览 XML 数据之外,在有些情况下,XPathNavigator 类还可以用于编辑 XML 文档,这取决于创建文档的对象。
XPathDocument 类是只读的,而 XmlDocument 类是可编辑的,因此,通过 XPathDocument 对象创建的 XPathNavigator 对象不能用于编辑 XML 文档,而通过 XmlDocument 对象创建的就可以。XPathDocument 类只应用于读取 XML 文档。如果需要编辑 XML 文档,或要求访问 XmlDocument 类提供的其他功能(例如事件处理),应使用 XmlDocument 类。
XPathNavigator 类的 CanEdit 属性指定 XPathNavigator 对象是否可以编辑 XML 数据。
下表说明了每个类的 CanEdit 属性的值。
IXPathNavigable 实现 | CanEdit 值 |
---|---|
XPathDocument | false |
XmlDocument | true |
XPathNavigator 类提供一组方法,用于使用 XPath 表达式在 XPathDocument 或 XmlDocument 对象中选择节点集。选择后,可以循环访问所选的节点集。
XPathNavigator 选择方法
XPathNavigator 类提供一组方法,用于使用 XPath 表达式在 XPathDocument 或 XmlDocument 对象中选择节点集。XPathNavigator 类还提供一组经过优化的方法,选择上级节点、子节点和子代节点的速度比使用 XPath 表达式更快。如果选择单个节点,所选的节点集将在 XPathNodeIterator 对象或 XPathNavigator 对象中返回。
使用 XPath 表达式选择节点
要使用 XPath 表达式选择节点集,请使用下列选择方法之一。
-
Select
-
SelectSingleNode
在调用时,如果选择单个节点,这些方法将返回一组节点,您可以使用 XPathNodeIterator 对象或 XPathNavigator 对象随意浏览。
使用 XPathNodeIterator 对象浏览不会影响用于创建该对象的 XPathNavigator 对象的位置。从 SelectSingleNode 方法返回的 XPathNavigator 对象位于单个返回的节点上,同样不会影响用于创建该对象的 XPathNavigator 对象的位置。
以下示例显示如何通过 XPathDocument 对象创建 XPathNavigator 对象、如何使用 Select 方法选择 XPathDocument 对象中的节点以及如何使用 XPathNodeIterator 对象循环访问所选的节点。
<bookstore>
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
XPathNodeIterator nodes = navigator.Select("/bookstore/book");
while(nodes.MoveNext())
{
Console.WriteLine(nodes.Current.Name);
}
经过优化的选择方法
XPathNavigator 类的 SelectChildren、SelectAncestors 和 SelectDescendants 方法表示通常用于检索子节点、子代节点和上级节点的 XPath 表达式。这些方法的性能已得到优化,比相应的 XPath 表达式速度更快。SelectChildren、SelectAncestors 和 SelectDescendants 方法基于 XPathNodeType 值或要选择的节点的本地名称和命名空间 URI 选择上级节点、子节点和子代节点。所选的上级节点、子节点和子代节点将在 XPathNodeIterator 对象中返回。
XPathNavigator 类提供两组浏览方法,第一组(在 使用 XPathNavigator 的节点集定位 主题中介绍)用于浏览 XPathDocument 或 XmlDocument 对象中的节点集。第二组(在本主题中介绍)用于浏览 XPathDocument 或 XmlDocument 对象中的属性和命名空间节点。
浏览属性节点
属性是元素的属性,不是元素的子级。这一区别很重要,因为用来浏览同辈节点、父节点和子节点的 XPathNavigator 类的方法不同。
例如,MoveToPrevious 和 MoveToNext 方法不用来从元素浏览到属性或在属性间浏览。属性采用不同的浏览方法。
以下是 XPathNavigator 类的属性浏览方法。
-
MoveToAttribute
-
MoveToFirstAttribute
-
MoveToNextAttribute
当当前节点是元素时,可以使用 HasAttributes 方法查看是否存在任何与此元素关联的属性。如果已知元素具有属性,有多种方法可以访问这些属性。要从元素中检索单个属性,请使用 GetAttribute 方法。要将 XPathNavigator 移至特定属性,请使用 MoveToAttribute 方法。还可以循环访问元素的每个属性,方法是先使用 MoveToFirstAttribute 方法,然后多次调用 MoveToNextAttribute 方法。
注意 |
---|
如果 XPathNavigator 对象位于某个属性或命名空间节点上,MoveToChild、MoveToDescendant、MoveToFirst、MoveToFirstChild、MoveToFollowing、MoveToId、MoveToNext 和 MoveToPrevious 方法始终返回 false,对 XPathNavigator 的位置没有影响。MoveTo、MoveToParent 和 MoveToRoot 方法例外。 |
可以通过多种不同的方式在 Microsoft .NET Framework 中表示 XML 文档。包括使用 String,或通过使用 XmlReader、XmlWriter、XmlDocument 或 XPathDocument 类。为了便于在这些不同的 XML 文档表示形式之间切换,XPathNavigator 类提供了许多方法和属性,用于将 XML 作为 String, XmlReader 对象或 XmlWriter 对象提取。