XML 文档对象模型从XmlDocument 处理事件

如何处理来自 XmlDocument 的事件

此示例阐释当 XML 文档中的节点更改时,如何接收和处理事件。特别要说明的是,此示例说明了如何捕获以下段落中说明的 NodeChanged 和 NodeInserted 事件。

修改 XmlDocument 可能会引起下面的一个或多个事件:

  • 当属于 XmlDocument 的任何节点被插入其他节点时,将发生 NodeInserted 事件。这包括由此文档创建的所有节点,不论它们是在文档树的内部还是外部,包括属性节点。
  • 当把属于此文档的任何节点从其父级移除时,将发生 NodeRemoved 事件。这包括由此文档创建的所有节点,不论它们是在文档树的内部还是外部,包括属性节点。
  • 当属于此文档的任何节点的 Value 属性被更改时,将发生 NodeChanged 事件。这仅应用于有 Value 属性的节点。
  • 当属于此文档的任何节点要被插入、移除或更改时,将发生 NodeInserting、NodeRemoving 或 NodeChanging 事件。

这些事件使您可以在要停止操作时引发异常。XmlDocument 确保在引发异常后,文档将回到操作开始前的状态。

 
VB XmlDocumentEvent.aspx

[运行示例] | [查看源代码]

在将 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  nodes and change their values
            XmlNodeList myXmlNodeList = myXmlDocument.SelectNodes("descendant::book/price");
            foreach (XmlNode myXmlNode in myXmlNodeList)
            {
            Console.WriteLine("<" + myXmlNode.Name + "> " + myXmlNode.InnerText);
            Double price = Double.Parse(myXmlNode.InnerText);
            myXmlNode.InnerText = (((Double)price * 1.02).ToString("#.00"));
            }
            
C# VB  

该示例应用程序还将一个节点插入 XmlDocument。一个插入新节点的简单方法是:创建一个 XmlDocumentFragment,确定要在文档中插入片段的位置,然后使用 XmlDocument 的 InsertBefore 或 InsertAfter 方法。如下列代码所示,该示例使用已准备好的 XML 的字符串创建 XmlDocumentFragment,然后将此片段插入 XmlDocument。插入新节点后,即发生 NodeInserted 事件,将新节点信息输出到屏幕上。(NodeInserted 事件的代码将出现在本主题的后面部分中。)

// Create a new book
            XmlDocumentFragment myNewBook = myXmlDocument.CreateDocumentFragment();
            myNewBook.InnerXml = ("" +
            "" +
            "" +
            "Eric" +
            "Gamma" +
            "" +
            "
            49.95
            " +
            "");
            XmlElement rootXmlElement = myXmlDocument.DocumentElement;
            // Add the new book to the XmlDocument
            rootXmlElement.InsertBefore(myNewBook, rootXmlElement.FirstChild);
            ...
            // Clone the node and note that by cloning the node we
            // are inserting it again into the XmlDocument
            XmlNode myNewBook2 = myXmlDocument.DocumentElement.FirstChild.Clone();
            
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  

摘要

  1. 要编辑节点值,首先使用 SelectNodes 选择节点,然后将选定的节点放到 XmlNodeList 中。
  2. 有六个可处理的节点事件:NodeInserted、NodeRemoved、NodeChanged、NodeInserting、NodeRemoving 或 NodeChanging。
  3. 要处理节点,可将节点处理程序添加到 XmlDocument 的实例中。
原文地址:https://www.cnblogs.com/chorrysky/p/584486.html