Partager via


Exemple d’extensions faiblement typées

L’exemple LooselyTypedExtensions présente les techniques de base d’utilisation des données d’extension.

Le modèle objet de syndication fournit une prise en charge complète pour l’utilisation des données d’extension : informations présentes dans la représentation XML d’un flux de syndication, mais qui ne sont pas exposées explicitement par les classes telles que SyndicationFeed et SyndicationItem.

L'exemple utilise la classe SyndicationFeed. Toutefois, les modèles présentés dans cet exemple peuvent être utilisés avec toutes les classes de syndication qui prennent en charge les données d’extension :

SyndicationFeed

SyndicationItem

SyndicationCategory

SyndicationPerson

SyndicationLink

Exemple XML

Pour référence, le document XML suivant est utilisé dans cet exemple.

<?xml version="1.0" encoding="IBM437"?>
<feed myAttribute="someValue" xmlns="http://www.w3.org/2005/Atom">
  <title type="text"></title>
  <id>uuid:8f60c7b3-a3c0-4de7-a642-2165d77ce3c1;id=1</id>
  <updated>2007-09-07T22:15:34Z</updated>
  <simpleString xmlns="">hello, world!</simpleString>
  <simpleString xmlns="">another simple string</simpleString>
  <DataContractExtension xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.d
atacontract.org/2004/07/Microsoft.Syndication.Samples">
    <Key>X</Key>
    <Value>4</Value>
  </DataContractExtension>
  <XmlSerializerExtension xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://ww
w.w3.org/2001/XMLSchema" xmlns="">
    <Key>Y</Key>
    <Value>8</Value>
  </XmlSerializerExtension>
  <xElementExtension xmlns="">
    <Key attr1="someValue">Z</Key>
    <Value attr1="someValue">15</Value>
  </xElementExtension>
</feed>

Ce document contient les données d’extension suivantes :

  • Attribut myAttribute de l'élément <feed>.

  • Élément <simpleString>.

  • Élément <DataContractExtension>.

  • Élément <XmlSerializerExtension>.

  • Élément <xElementExtension>.

Écriture des données d’extension

Les extensions d’attribut sont créées en ajoutant des entrées à la collection AttributeExtensions, comme l’illustre l’exemple de code suivant.

//Attribute extensions are stored in a dictionary indexed by
// XmlQualifiedName
feed.AttributeExtensions.Add(new XmlQualifiedName("myAttribute", ""), "someValue");

Les extensions d’élément sont créées en ajoutant des entrées à la collection ElementExtensions. Ces extensions peuvent être des valeurs de base telles que des chaînes, des sérialisations XML d'objets .NET Framework ou des nœuds XML encodés manuellement.

L’exemple de code suivant crée un élément d’extension appelé simpleString.

feed.ElementExtensions.Add("simpleString", "", "hello, world!");

L’espace de noms XML pour cet élément est l’espace de noms vide ("") et sa valeur est un nœud de texte qui contient la chaîne "hello, world!".

L’une des méthodes permettant de créer des extensions d’élément complexes composées de nombreux éléments imbriqués consiste à utiliser les API .NET Framework pour la sérialisation (DataContractSerializer et XmlSerializer sont tous deux pris en charge), comme illustré dans les exemples suivants.

feed.ElementExtensions.Add( new DataContractExtension() { Key = "X", Value = 4 } );
feed.ElementExtensions.Add( new XmlSerializerExtension { Key = "Y", Value = 8 }, new XmlSerializer( typeof( XmlSerializerExtension ) ) );

Dans cet exemple, DataContractExtension et XmlSerializerExtension sont des types personnalisés écrits pour être utilisés avec un sérialiseur.

La classe SyndicationElementExtensionCollection permet également de créer des extensions d'élément à partir d'une instance XmlReader. Cela permet une intégration aisée avec les API de traitement XML telles que XElement, comme l'illustre l'exemple de code suivant.

feed.ElementExtensions.Add(new XElement("xElementExtension",
        new XElement("Key", new XAttribute("attr1", "someValue"), "Z"),
        new XElement("Value", new XAttribute("attr1", "someValue"),
        "15")).CreateReader());

Lecture des données d’extension

Les valeurs des extensions d’attribut peuvent être obtenues en recherchant l’attribut dans la collection AttributeExtensions en fonction de son XmlQualifiedName, comme l’illustre l’exemple de code suivant.

Console.WriteLine( feed.AttributeExtensions[ new XmlQualifiedName( "myAttribute", "" )]);

Les extensions d’élément sont accessibles à l’aide de la méthode ReadElementExtensions<T>.

foreach( string s in feed2.ElementExtensions.ReadElementExtensions<string>("simpleString", ""))
{
    Console.WriteLine(s);
}

foreach (DataContractExtension dce in feed2.ElementExtensions.ReadElementExtensions<DataContractExtension>("DataContractExtension",
"http://schemas.datacontract.org/2004/07/SyndicationExtensions"))
{
    Console.WriteLine(dce.ToString());
}

foreach (XmlSerializerExtension xse in feed2.ElementExtensions.ReadElementExtensions<XmlSerializerExtension>("XmlSerializerExtension", "", new XmlSerializer(typeof(XmlSerializerExtension))))
{
    Console.WriteLine(xse.ToString());
}

Il est également possible d'obtenir un XmlReader au niveau de chaque extension d'élément en utilisant la méthode GetReader().

foreach (SyndicationElementExtension extension in feed2.ElementExtensions.Where<SyndicationElementExtension>(x => x.OuterName == "xElementExtension"))
{
    XNode xelement = XElement.ReadFrom(extension.GetReader());
    Console.WriteLine(xelement.ToString());
}

Pour configurer, générer et exécuter l'exemple

  1. Assurez-vous d’avoir effectué la Procédure d’installation unique pour les exemples Windows Communication Foundation.

  2. Pour générer l’édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans Building the Windows Communication Foundation Samples.

  3. Pour exécuter l’exemple dans une configuration à un ou plusieurs ordinateurs, conformez-vous aux instructions figurant dans la rubrique Exécution des exemples Windows Communication Foundation.

Voir aussi