Beispiel zu lose typisierten Erweiterungen

Dieses LooselyTypedExtensions-Beispiel veranschaulicht die grundlegenden Techniken zum Arbeiten mit Erweiterungsdaten.

Das Syndication-Objektmodell bietet umfangreiche Unterstützung zum Arbeiten mit Erweiterungsdaten – Informationen, die in der XML-Darstellung eines Syndication-Feeds vorhanden, jedoch nicht explizit durch Klassen wie SyndicationFeed und SyndicationItem verfügbar gemacht werden.

Für das Beispiel wird die SyndicationFeed-Klasse verwendet. Die in diesem Beispiel gezeigten Muster können jedoch mit allen Syndication-Klassen verwendet werden, die Erweiterungsdaten unterstützen:

SyndicationFeed

SyndicationItem

SyndicationCategory

SyndicationPerson

SyndicationLink

Beispiel-XML

Zu Referenzzwecken wird in diesem Beispiel das folgende XML-Dokument verwendet.

<?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>

Dieses Dokument enthält die folgenden einzelnen Erweiterungsdaten:

  • Das myAttribute-Attribut des <feed>-Elements.

  • <simpleString>-Element.

  • <DataContractExtension>-Element.

  • <XmlSerializerExtension>-Element.

  • <xElementExtension>-Element.

Schreiben von Erweiterungsdaten

Attributerweiterungen werden erstellt, indem man der AttributeExtensions-Auflistung Einträge hinzufügt, wie im folgenden Beispielcode gezeigt.

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

Elementerweiterungen werden erstellt, indem man der ElementExtensions-Auflistung Einträge hinzufügt. Diese Erweiterungen können einfache Werte (wie Zeichenfolgen), XML-Serialisierungen von .NET Framework-Objekten oder manuell codierte XML-Knoten sein.

Im folgenden Beispielcode wird ein Erweiterungselement namens simpleString erstellt.

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

Der XML-Namespace für dieses Element ist der leere Namespace (""), und sein Wert ist ein Textknoten, der die Zeichenfolge „hello, world!“ enthält.

Eine Möglichkeit zum Erstellen komplexer Elementerweiterungen, die aus vielen verschachtelten Elementen bestehen, wäre die Verwendung der .NET Framework-APIs zur Serialisierung (sowohl DataContractSerializer als auch XmlSerializer werden unterstützt), wie in den folgenden Beispielen dargestellt.

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

In diesem Beispiel sind DataContractExtension und XmlSerializerExtension benutzerdefinierte, zur Verwendung mit einem Serialisierer geschriebene Typen.

Elementerweiterungen können auch mithilfe der SyndicationElementExtensionCollection-Klasse aus einer XmlReader-Instanz erstellt werden. Dies erlaubt eine einfache Integration in APIs für die Verarbeitung von XML (wie XElement), wie im folgenden Beispielcode gezeigt.

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

Lesen von Erweiterungsdaten

Die Werte für Attributerweiterungen können erhalten werden, indem das Attribut in der AttributeExtensions-Auflistung anhand seines XmlQualifiedName nachgeschlagen wird, wie im folgenden Beispielcode gezeigt.

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

Der Zugriff auf Elementerweiterungen erfolgt mit der ReadElementExtensions<T>-Methode.

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());
}

Es ist auch möglich, einen XmlReader bei einzelnen Elementerweiterungen mithilfe der GetReader()-Methode abzurufen.

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

So können Sie das Beispiel einrichten, erstellen und ausführen

  1. Stellen Sie sicher, dass Sie die Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation ausgeführt haben.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.

  3. Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder über Computer hinweg ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.

Siehe auch