XmlSerializer.UnknownAttribute XmlSerializer.UnknownAttribute XmlSerializer.UnknownAttribute XmlSerializer.UnknownAttribute Event


當還原序列化期間,XmlSerializer 遭遇未知型別的 XML 屬性時發生。Occurs when the XmlSerializer encounters an XML attribute of unknown type during deserialization.

 event System::Xml::Serialization::XmlAttributeEventHandler ^ UnknownAttribute;
public event System.Xml.Serialization.XmlAttributeEventHandler UnknownAttribute;
member this.UnknownAttribute : System.Xml.Serialization.XmlAttributeEventHandler 
Public Custom Event UnknownAttribute As XmlAttributeEventHandler 


下列範例會列印任何未知的屬性時發生還原序列化的 XML 文件的相關資訊。The following example prints information about any unknown attributes encountered while deserializing an XML document.

#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
   static void main()
      Test^ t = gcnew Test;
      // Deserialize the file containing unknown elements.
      t->DeserializeObject( "UnknownAttributes.xml" );

   void Serializer_UnknownAttribute( Object^ sender, XmlAttributeEventArgs^ e )
      Console::WriteLine( "Unknown Attribute" );
      Console::WriteLine( "\t{0} {1}", e->Attr->Name, e->Attr->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->UnknownAttribute += gcnew XmlAttributeEventHandler( this, &Test::Serializer_UnknownAttribute );

      // 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()
using System;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using System.Xml.Schema;

public class Group{
   public string GroupName;

public class Test{
   static void Main(){
      Test t = new Test();
      // Deserialize the file containing unknown elements.
   private void Serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e){
      Console.WriteLine("Unknown Attribute");
      Console.WriteLine("\t" + e.Attr.Name + " " + e.Attr.InnerXml);
      Console.WriteLine("\t LineNumber: " + e.LineNumber);
      Console.WriteLine("\t LinePosition: " + e.LinePosition);
      Group x  = (Group) e.ObjectBeingDeserialized;
      Console.WriteLine (x.GroupName);
      Console.WriteLine (sender.ToString());
   private void DeserializeObject(string filename){
      XmlSerializer ser = new XmlSerializer(typeof(Group));
      // Add a delegate to handle unknown element events.
      ser.UnknownAttribute+=new XmlAttributeEventHandler(Serializer_UnknownAttribute);
      // A FileStream is needed to read the XML document.
     FileStream fs = new FileStream(filename, FileMode.Open);
     Group g = (Group) ser.Deserialize(fs);
Imports System
Imports System.IO
Imports System.Xml.Serialization
Imports System.Xml
Imports System.Xml.Schema
Imports Microsoft.VisualBasic

Public Class Group
   Public GroupName As String 
End Class

Public Class Test
   Shared Sub Main()
      Dim t As Test = new Test()
      ' Deserialize the file containing unknown elements.
   End Sub

   Private Sub Serializer_UnknownAttribute _
   (sender As Object , e As XmlAttributeEventArgs)
      Console.WriteLine("Unknown Attribute")
      Console.WriteLine(ControlChars.Tab & e.Attr.Name + " " & e.Attr.InnerXml)
      Console.WriteLine(ControlChars.Tab & e.LineNumber & ":"  & e.LineNumber)
      Console.WriteLine(ControlChars.Tab & e.LinePosition & ":"   & e.LinePosition)
      Dim x As Group = CType( e.ObjectBeingDeserialized, Group)
      Console.WriteLine (x.GroupName)
      Console.WriteLine (sender.ToString())
   End Sub
   Private Sub DeserializeObject(filename As String)
      Dim ser As XmlSerializer = new XmlSerializer(GetType(Group))
      ' Add a delegate to handle unknown element events.
      AddHandler ser.UnknownAttribute, _
      AddressOf Serializer_UnknownAttribute 
      ' A FileStream is needed to read the XML document.
     Dim fs As FileStream  = new FileStream(filename, FileMode.Open)
     Dim g  As Group = CType(ser.Deserialize(fs),Group)
   End Sub
End Class


根據預設之後呼叫,Deserialize方法,XmlSerializer會忽略未知型別的 XML 屬性。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.

如果正在還原序列化類別的執行個體包含的欄位,傳回的陣列XmlAttribute物件和XmlAnyAttributeAttribute已套用至欄位,UnknownAttribute事件不會發生。If the instance of the class being deserialized contains a field that returns an array of XmlAttribute objects and an XmlAnyAttributeAttribute has been applied to the field, the UnknownAttribute event does not occur. 相反地,所有的未知的 XML 屬性會收集到的陣列。Instead, all unknown XML attributes are collected into the array.