如何处理来自 XmlDocument 的事件
此示例阐释当 XML 文档中的节点更改时,如何接收和处理事件。特别要说明的是,此示例说明了如何捕获以下段落中说明的 NodeChanged 和 NodeInserted 事件。
修改 XmlDocument 可能会引起下面的一个或多个事件:
- 当属于 XmlDocument 的任何节点被插入其他节点时,将发生 NodeInserted 事件。这包括由此文档创建的所有节点,不论它们是在文档树的内部还是外部,包括属性节点。
- 当把属于此文档的任何节点从其父级移除时,将发生 NodeRemoved 事件。这包括由此文档创建的所有节点,不论它们是在文档树的内部还是外部,包括属性节点。
- 当属于此文档的任何节点的 Value 属性被更改时,将发生 NodeChanged 事件。这仅应用于有 Value 属性的节点。
- 当属于此文档的任何节点要被插入、移除或更改时,将发生 NodeInserting、NodeRemoving 或 NodeChanging 事件。
这些事件使您可以在要停止操作时引发异常。XmlDocument 确保在引发异常后,文档将回到操作开始前的状态。
![]()
[运行示例] | [查看源代码] |
在将 books.xml 文件加载到 XmlDocument 后,此示例应用程序修改文档中现有书籍的价格,并向文档中添加新书。这些更改将导致 NodeChanged 和 NodeInserted 事件。
下列示例代码构造一个 XmlDocument 并加载 books.xml。
XmlDocument myXmlDocument = new XmlDocument(); myXmlDocument.Load (args); |
||
C# | VB |
该示例加载完 books.xml 以后,即将 NodeChanged 和 NodeInserted 事件处理程序添加到 XmlDocument。(这些处理程序的代码将出现在本主题的后面部分中。)
myXmlDocument.NodeChanged += new XmlNodeChangedEventHandler(this.MyNodeChangedEvent); myXmlDocument.NodeInserted += new XmlNodeChangedEventHandler(this.MyNodeInsertedEvent); |
||
C# | VB |
该示例应用程序更改文档中的数据,将每本书的价格增加 2%。为此,该示例必须首先使用 XmlNode 类的 SelectNodes 方法选择要更改的数据。通过使用 SelectNodes 方法的 XML 路径语言 (Xpath) 表达式“descendant::book/price”,该示例选择所有书籍元素的价格子元素。然后,应用程序将这些选定的节点置于 XmlNodeList 中,在那里将对它们进行编辑,以反映 2% 的价格增长情况。价格增长操作包括以下步骤:获取价格元素的 InnerText 值,将该值增加 2%,然后将修改后的值插回到元素中。每当价格元素更改时,都有一个 NodeChanged 事件将新价格输出到屏幕上。(NodeChanged 事件的代码将出现在本主题的后面部分中。)
// Increase all the book prices by 2% ... // Create a list of the |
||
C# | VB |
该示例应用程序还将一个节点插入 XmlDocument。一个插入新节点的简单方法是:创建一个 XmlDocumentFragment,确定要在文档中插入片段的位置,然后使用 XmlDocument 的 InsertBefore 或 InsertAfter 方法。如下列代码所示,该示例使用已准备好的 XML 的字符串创建 XmlDocumentFragment,然后将此片段插入 XmlDocument。插入新节点后,即发生 NodeInserted 事件,将新节点信息输出到屏幕上。(NodeInserted 事件的代码将出现在本主题的后面部分中。)
// Create a new book XmlDocumentFragment myNewBook = myXmlDocument.CreateDocumentFragment(); myNewBook.InnerXml = (" |
||
C# | VB |
下列代码说明处理 NodeChanged 和 NodeInserted 事件的函数。
// Handle the Node Changed Event public void MyNodeChangedEvent(Object src, XmlNodeChangedEventArgs args) { Console.Write("Node Changed Event: <" + args.Node.Name + "> changed"); if (args.Node.Value != null) { Console.WriteLine(" with value " + args.Node.Value); } else Console.WriteLine(""); } // Handle the Node Inserted Event public void MyNodeInsertedEvent(Object src, XmlNodeChangedEventArgs args) { Console.Write("Node Inserted Event: <" + args.Node.Name + "> inserted"); if (args.Node.Value != null) { Console.WriteLine(" with value " + args.Node.Value); } else Console.WriteLine(""); } |
||
C# | VB |
摘要
- 要编辑节点值,首先使用 SelectNodes 选择节点,然后将选定的节点放到 XmlNodeList 中。
- 有六个可处理的节点事件:NodeInserted、NodeRemoved、NodeChanged、NodeInserting、NodeRemoving 或 NodeChanging。
- 要处理节点,可将节点处理程序添加到 XmlDocument 的实例中。