XmlSerializer::UnknownElement Event


The .NET API Reference documentation has a new home. Visit the .NET API Browser on docs.microsoft.com to see the new experience.

Occurs when the XmlSerializer encounters an XML element of unknown type during deserialization.

Namespace:   System.Xml.Serialization
Assembly:  System.Xml (in System.Xml.dll)

event XmlElementEventHandler^ UnknownElement {
	void add(XmlElementEventHandler^ value);
	void remove(XmlElementEventHandler^ value);

By default, after calling the Deserialize method, the XmlSerializer ignores XML attributes of unknown types. However, you can use this event to handle such node types.


If the XmlAnyElementAttribute is applied to a field that returns an array of XmlElement objects, all unknown elements are collected in the array. In that case, the UnknownElement event does not occur.

The following example deserializes a class named Group from a file named UnknownElements.xml. Whenever an element is found in the file that has no corresponding member in the class, the UnknownElement event occurs. To try the example, paste the following XML code into a file named UnknownElements.xml.

<?xml version="1.0" encoding="utf-8"?>
<Group xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
#using <System.Xml.dll>
#using <System.dll>

using namespace System;
using namespace System::IO;
using namespace System::Xml::Serialization;
using namespace System::Xml;
using namespace System::Xml::Schema;

public ref class Group
   String^ GroupName;

public ref class Test
   void Serializer_UnknownElement( Object^ sender, XmlElementEventArgs^ e )
      Console::WriteLine( "Unknown Element" );
      Console::Write( "\t {0}", e->Element->Name );
      Console::WriteLine( " {0}", e->Element->InnerXml );
      Console::WriteLine( "\t LineNumber: {0}", e->LineNumber );
      Console::WriteLine( "\t LinePosition: {0}", e->LinePosition );
      Group^ x = dynamic_cast<Group^>(e->ObjectBeingDeserialized);
      Console::WriteLine( x->GroupName );
      Console::WriteLine( sender );

   void DeserializeObject( String^ filename )
      XmlSerializer^ ser = gcnew XmlSerializer( Group::typeid );

      // Add a delegate to handle unknown element events.
      ser->UnknownElement += gcnew XmlElementEventHandler( this, &Test::Serializer_UnknownElement );

      // A FileStream is needed to read the XML document.
      FileStream^ fs = gcnew FileStream( filename,FileMode::Open );
      Group^ g = dynamic_cast<Group^>(ser->Deserialize( fs ));

int main()
   Test^ t = gcnew Test;

   // Deserialize the file containing unknown elements.
   t->DeserializeObject( "UnknownElements.xml" );

.NET Framework
Available since 1.1
Return to top