次の方法で共有


XmlSerializer.UnknownNode イベント

逆シリアル化時に XmlSerializer が不明な型の XML ノードを認識した場合に発生します。

Public Event UnknownNode As XmlNodeEventHandler
[C#]
public event XmlNodeEventHandler UnknownNode;
[C++]
public: __event XmlNodeEventHandler* UnknownNode;

[JScript] JScript では、このクラスで定義されているイベントを処理できます。ただし、独自に定義することはできません。

イベント データ

イベント ハンドラが、このイベントに関連するデータを含む、XmlNodeEventArgs 型の引数を受け取りました。次の XmlNodeEventArgs プロパティには、このイベントの固有の情報が記載されます。

プロパティ 説明
LineNumber 不明な XML ノードの行番号を取得します。
LinePosition 不明な XML ノードが見つかった行内の位置を取得します。
LocalName 逆シリアル化されている XML ノードの XML ローカル名を取得します。
Name 逆シリアル化されている XML ノードの名前を取得します。
NamespaceURI 逆シリアル化されている XML ノードに関連付けられている名前空間 URI を取得します。
NodeType 逆シリアル化されている XML ノードの型を取得します。
ObjectBeingDeserialized 逆シリアル化されているオブジェクトを取得します。
Text 逆シリアル化されている XML ノードのテキストを取得します。

解説

既定では、 Deserialize メソッドを呼び出した後は、 XmlSerializer は不明な型の XML ノードを無視します。ただし、このイベントを使用することにより、このようなノード型を処理できます。

使用例

[Visual Basic, C#, C++] 認識された不明なノード型を出力する例を次に示します。

 
Imports System
Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization

Public Class Group
   ' Only the GroupName field will be known.
   Public GroupName As String
End Class

Public Class Test
   Shared Sub Main()
      Dim t As Test = New Test()
      t.DeserializeObject("UnknownNodes.xml")
   End Sub

   Private Sub DeserializeObject(filename As String )
      Dim mySerializer As XmlSerializer  = New XmlSerializer(GetType(Group))
      Dim fs As FileStream = New FileStream(filename, FileMode.Open)
      AddHandler mySerializer.UnknownNode, _
      AddressOf serializer_UnknownNode
      Dim myGroup As Group = _
      CType(mySerializer.Deserialize(fs), Group)
      fs.Close()
   End Sub
   
   Protected Sub serializer_UnknownNode _
   (sender As object , e As XmlNodeEventArgs )
      Console.WriteLine _
      ("UnknownNode Name: {0}", e.Name)
      Console.WriteLine _
      ("UnknownNode LocalName: {0}" ,e.LocalName)
      Console.WriteLine _
      ("UnknownNode Namespace URI: {0}", e.NamespaceURI)
      Console.WriteLine _
      ("UnknownNode Text: {0}", e.Text)

      Dim myNodeType As XmlNodeType = e.NodeType
      Console.WriteLine("NodeType: {0}", myNodeType)
 
      Dim myGroup As Group = CType(e.ObjectBeingDeserialized, Group)
      Console.WriteLine("GroupName: {0}", myGroup.GroupName)
      Console.WriteLine()
   End Sub
End Class
' Paste this XML into a file named UnknownNodes:
'<?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" xmlns:coho = "http:'www.cohowinery.com" 

'xmlns:cp="http:'www.cpandl.com">
'   <coho:GroupName>MyGroup</coho:GroupName>
'   <cp:GroupSize>Large</cp:GroupSize>
'   <cp:GroupNumber>444</cp:GroupNumber>
'   <coho:GroupBase>West</coho:GroupBase>
'   <coho:ThingInfo>
'      <Number>1</Number>
'      <Name>Thing1</Name>
'      <Elmo>
'         <Glue>element</Glue>
'      </Elmo>
'  </coho:ThingInfo>
'/Group>

[C#] 
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

public class Group{
   // Only the GroupName field will be known.
   public string GroupName;
}

public class Test{
   static void Main(){
      Test t = new Test();
      t.DeserializeObject("UnknownNodes.xml");
   }

   private void DeserializeObject(string filename){
      XmlSerializer mySerializer = new XmlSerializer(typeof(Group));
      FileStream fs = new FileStream(filename, FileMode.Open);
      mySerializer.UnknownNode += new 
      XmlNodeEventHandler(serializer_UnknownNode);
      Group myGroup = (Group) mySerializer.Deserialize(fs);
      fs.Close();
   }
   protected void serializer_UnknownNode
   (object sender, XmlNodeEventArgs e){
      Console.WriteLine
      ("UnknownNode Name: {0}", e.Name);
      Console.WriteLine
      ("UnknownNode LocalName: {0}" ,e.LocalName);
      Console.WriteLine
      ("UnknownNode Namespace URI: {0}", e.NamespaceURI);
      Console.WriteLine
      ("UnknownNode Text: {0}", e.Text);

      XmlNodeType myNodeType = e.NodeType;
      Console.WriteLine("NodeType: {0}", myNodeType);
 
      Group myGroup = (Group) e.ObjectBeingDeserialized;
      Console.WriteLine("GroupName: {0}", myGroup.GroupName);
      Console.WriteLine();
   }
}
/* Paste this XML into a file named UnknownNodes:
<?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" xmlns:coho = "http://www.cohowinery.com" 

xmlns:cp="http://www.cpandl.com">
   <coho:GroupName>MyGroup</coho:GroupName>
   <cp:GroupSize>Large</cp:GroupSize>
   <cp:GroupNumber>444</cp:GroupNumber>
   <coho:GroupBase>West</coho:GroupBase>
   <coho:ThingInfo>
      <Number>1</Number>
      <Name>Thing1</Name>
      <Elmo>
         <Glue>element</Glue>
      </Elmo>
   </coho:ThingInfo>
</Group>
*/   

[C++] 
#using <mscorlib.dll>
#using <System.Xml.dll>
using namespace System;
using namespace System::IO;
using namespace System::Xml;
using namespace System::Xml::Serialization;

public __gc class Group{
   // Only the GroupName field will be known.
public:
   String* GroupName;
};

public __gc class Test{
public:
   static void main(){
      Test* t = new Test();
      t->DeserializeObject(S"UnknownNodes.xml");
   }

private:
   void DeserializeObject(String* filename){
      XmlSerializer* mySerializer = new XmlSerializer(__typeof(Group));
      FileStream* fs = new FileStream(filename, FileMode::Open);
      mySerializer->UnknownNode += new 
         XmlNodeEventHandler(this, &Test::serializer_UnknownNode);
      Group* myGroup = dynamic_cast<Group*> (mySerializer->Deserialize(fs));
      fs->Close();
   }
protected:
   void serializer_UnknownNode
      (Object* /*sender*/, XmlNodeEventArgs* e){
         Console::WriteLine(S"UnknownNode Name: {0}",e->Name);
         Console::WriteLine(S"UnknownNode LocalName: {0}",e->LocalName);
         Console::WriteLine(S"UnknownNode Namespace URI: {0}",e->NamespaceURI);
         Console::WriteLine(S"UnknownNode Text: {0}",e->Text);

         XmlNodeType myNodeType = e->NodeType;
         Console::WriteLine(S"NodeType: {0}", __box(myNodeType));

         Group* myGroup = dynamic_cast<Group*> (e->ObjectBeingDeserialized);
         Console::WriteLine(S"GroupName: {0}",myGroup->GroupName);
         Console::WriteLine();
      }
};

int main()
{
   Test::main();
}
/* Paste this XML into a file named UnknownNodes:
<?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" xmlns:coho = "http://www.cohowinery.com" 

xmlns:cp="http://www.cpandl.com">
   <coho:GroupName>MyGroup</coho:GroupName>
   <cp:GroupSize>Large</cp:GroupSize>
   <cp:GroupNumber>444</cp:GroupNumber>
   <coho:GroupBase>West</coho:GroupBase>
   <coho:ThingInfo>
      <Number>1</Number>
      <Name>Thing1</Name>
      <Elmo>
         <Glue>element</Glue>
      </Elmo>
   </coho:ThingInfo>
</Group>
*/   

[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン 言語のフィルタ をクリックします。

必要条件

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ

参照

XmlSerializer クラス | XmlSerializer メンバ | System.Xml.Serialization 名前空間 | XmlAnyElementAttribute | XmlAnyAttributeAttribute | CanDeserialize | Deserialize | UnknownAttribute | XML シリアル化の概要 | 属性を使用した XML シリアル化の制御 | XML シリアル化の例 | XML スキーマ定義ツールと XML シリアル化