XmlAnyElementAttribute クラス
メンバ (XmlElement オブジェクトまたは XmlNode オブジェクトの配列を返すフィールド) に、シリアル化または逆シリアル化対象のオブジェクト内に対応するメンバがない任意の XML 要素を表すオブジェクトを含めることができるように指定します。
この型のすべてのメンバの一覧については、XmlAnyElementAttribute メンバ を参照してください。
System.Object
System.Attribute
System.Xml.Serialization.XmlAnyElementAttribute
<AttributeUsage(AttributeTargets.Property Or AttributeTargets.Field _
Or AttributeTargets.Parameter Or AttributeTargets.ReturnValue)>
Public Class XmlAnyElementAttribute Inherits Attribute
[C#]
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field
| AttributeTargets.Parameter | AttributeTargets.ReturnValue)]
public class XmlAnyElementAttribute : Attribute
[C++]
[AttributeUsage(AttributeTargets::Property |
AttributeTargets::Field | AttributeTargets::Parameter |
AttributeTargets::ReturnValue)]
public __gc class XmlAnyElementAttribute : public Attribute
[JScript]
public
AttributeUsage(AttributeTargets.Property | AttributeTargets.Field |
AttributeTargets.Parameter | AttributeTargets.ReturnValue)
class XmlAnyElementAttribute extends Attribute
スレッドセーフ
この型の public static (Visual Basicでは Shared) のすべてのメンバは、マルチスレッド操作で安全に使用できます。インスタンスのメンバの場合は、スレッドセーフであるとは限りません。
解説
XML ドキュメントに含まれるメタデータなど、XML ドキュメントの一部として送信される可能性がある任意のデータを XML 要素として含めるには、 XmlAnyElementAttribute を使用します。
XmlAnyElementAttribute は、 XmlElement オブジェクトまたは XmlNode オブジェクトの配列を返すフィールドに適用します。このようなフィールドは、オブジェクトがシリアル化されるか逆シリアル化されるかに応じて、2 つの方法で使用できます。シリアル化時には、オブジェクトは XML 要素または XML ノードとして生成されます。シリアル化対象のオブジェクト内にそれらの要素やノードに対応するメンバが存在するかどうかは関係ありません。この属性を適用するときに Name プロパティ値を指定した場合は、配列に挿入されるすべての XmlElement オブジェクトまたは XmlNode オブジェクトは、指定された同じ要素名と、同じ既定の名前空間を持っていることが必要です。それ以外の場合は、例外がスローされます。 Namespace プロパティ値を設定した場合は、同様に Name プロパティも設定する必要があり、 XmlElement オブジェクトまたは XmlNode オブジェクトの名前と名前空間の値がすべて同じであることが必要です。 Name 値を指定しない場合は、任意の名前を持つ XmlElement オブジェクトまたは XmlNode オブジェクトを配列に含めることができます。
XmlSerializer クラスの Deserialize メソッドが呼び出されると、逆シリアル化対象のオブジェクト内に対応するメンバがない要素はすべて、配列にまとめられます。逆シリアル化が終了したら、 XmlElement 項目のコレクションを反復処理して、データを処理できます。 Name 値を指定すると、配列には、指定した名前の XML 要素だけが格納されます。 Name 値を指定しない場合は、配列には、クラス内に対応するメンバがない要素がすべて格納されます。クラスに含まれている複数のフィールドにこの属性を適用する場合は、 Name プロパティを使用するか、 Name プロパティと Namespace プロパティを併用して、各配列の内容を区別できるようにする必要があります。このようなクラス (複数のフィールドが含まれている) に、配列を区別するためのプロパティ値 (つまり、 Name と Namespace) が設定されていないフィールドが 1 つ含まれている場合、逆シリアル化時に、この配列には、他の配列には格納されない不明な XML 要素が格納されます。配列を区別するための Name 値、または Name 値と Namespace 値の組み合わせが設定されていないフィールドがクラス内に複数含まれている場合には、逆シリアル化時の動作は不定です。
XmlAnyElementAttribute は、単一の XmlElement オブジェクトを返すフィールドにも適用できます。その場合は、 XmlElement クラスのプロパティとメソッドを使用して、不明な要素を繰り返し反復処理する必要があります。
XmlAnyElementAttribute の複数のインスタンスを 1 つのクラス メンバに適用できますが、各インスタンスには個別の Name プロパティ値を設定する必要があります。また、各インスタンスに同じ Name プロパティを設定した場合は、各インスタンスに設定する Namespace プロパティ値は個別にする必要があります。
XmlAnyElementAttribute をクラスのメンバに適用すると、 XmlSerializer の UnknownNode イベントと UnknownAttribute イベントは発生しなくなります。
メモ コードでは、 XmlAnyElementAttribute の代わりに XmlAnyElement という短い語を使用できます。
属性の使用方法については、「 属性を使用したメタデータの拡張 」を参照してください。
使用例
[Visual Basic, C#, C++] XmlElement オブジェクトの配列を返す AllElements という名前のフィールドに XmlAnyElementAttribute を適用する例を次に示します。
Public Class XClass
' Apply the XmlAnyElementAttribute to a field returning an array
' of XmlElement objects.
<XmlAnyElement()> Public AllElements() As XmlElement
End Class 'XClass
Public Class Test
Public Shared Sub Main()
Dim t As New Test()
t.DeserializeObject("XFile.xml")
End Sub 'Main
Private Sub DeserializeObject(filename As String)
' Create an XmlSerializer.
Dim mySerializer As New XmlSerializer(GetType(XClass))
' To read a file, a FileStream is needed.
Dim fs As New FileStream(filename, FileMode.Open)
' Deserialize the class.
Dim x As XClass = CType(mySerializer.Deserialize(fs), XClass)
' Read the element names and values.
Dim xel As XmlElement
For Each xel In x.AllElements
Console.WriteLine((xel.LocalName & ": " & xel.Value))
Next xel
End Sub 'DeserializeObject
End Class 'Test
[C#]
public class XClass
{
/* Apply the XmlAnyElementAttribute to a field returning an array
of XmlElement objects. */
[XmlAnyElement]
public XmlElement[] AllElements;
}
public class Test
{
public static void Main()
{
Test t = new Test();
t.DeserializeObject("XFile.xml");
}
private void DeserializeObject(string filename)
{
// Create an XmlSerializer.
XmlSerializer mySerializer = new XmlSerializer(typeof(XClass));
// To read a file, a FileStream is needed.
FileStream fs = new FileStream(filename, FileMode.Open);
// Deserialize the class.
XClass x = (XClass) mySerializer.Deserialize(fs);
// Read the element names and values.
foreach(XmlElement xel in x.AllElements)
Console.WriteLine(xel.LocalName + ": " + xel.Value);
}
}
[C++]
public __gc class XClass
{
/* Apply the XmlAnyElementAttribute to a field returning an array
of XmlElement objects. */
public:
[XmlAnyElement]
XmlElement* AllElements[];
};
public __gc class Test
{
public:
void DeserializeObject(String* filename)
{
// Create an XmlSerializer.
XmlSerializer* mySerializer = new XmlSerializer(__typeof(XClass));
// To read a file, a FileStream is needed.
FileStream* fs = new FileStream(filename, FileMode::Open);
// Deserialize the class.
XClass* x = dynamic_cast<XClass*> (mySerializer->Deserialize(fs));
// Read the element names and values.
System::Collections::IEnumerator* myEnum = x->AllElements->GetEnumerator();
while (myEnum->MoveNext())
{
XmlElement* xel = __try_cast<XmlElement*>(myEnum->Current);
Console::WriteLine(S"{0}: {1}", xel->LocalName, xel->Value);
}
}
};
int main()
{
Test* t = new Test();
t->DeserializeObject(S"XFile.xml");
}
[JScript] JScript のサンプルはありません。Visual Basic、C#、および C++ のサンプルを表示するには、このページの左上隅にある言語のフィルタ ボタン をクリックします。
必要条件
名前空間: System.Xml.Serialization
プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET
アセンブリ: System.Xml (System.Xml.dll 内)
参照
XmlAnyElementAttribute メンバ | System.Xml.Serialization 名前空間 | XmlAnyAttributeAttribute | XML シリアル化の概要