Udostępnij za pośrednictwem


Przykład luźno wpisanych rozszerzeń

Przykład LooselyTypedExtensions ilustruje podstawowe techniki pracy z danymi rozszerzenia.

Model obiektów Syndication zapewnia zaawansowaną obsługę pracy z danymi rozszerzenia — informacje, które znajdują się w reprezentacji XML źródła danych syndykacji, ale nie są jawnie uwidocznione przez klasy, takie jak SyndicationFeed i SyndicationItem.

W przykładzie użyto SyndicationFeed klasy na potrzeby przykładu. Jednak wzorce przedstawione w tym przykładzie mogą być używane ze wszystkimi klasami Syndication obsługującymi dane rozszerzenia:

SyndicationFeed

SyndicationItem

SyndicationCategory

SyndicationPerson

SyndicationLink

Przykładowy kod XML

Do celów referencyjnych w tym przykładzie jest używany następujący dokument XML.

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

Ten dokument zawiera następujące elementy danych rozszerzenia:

  • Atrybut myAttribute<feed> elementu.

  • <simpleString> Element.

  • <DataContractExtension> Element.

  • <XmlSerializerExtension> Element.

  • <xElementExtension> Element.

Zapisywanie danych rozszerzenia

Rozszerzenia atrybutów są tworzone przez dodanie wpisów do AttributeExtensions kolekcji, jak pokazano w poniższym przykładowym kodzie.

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

Rozszerzenia elementów są tworzone przez dodanie wpisów do kolekcji ElementExtensions . Te rozszerzenia mogą mieć podstawowe wartości, takie jak ciągi, serializacji XML obiektów programu .NET Framework lub węzły XML zakodowane ręcznie.

Poniższy przykładowy kod tworzy element rozszerzenia o nazwie simpleString.

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

Przestrzeń nazw XML dla tego elementu jest pustą przestrzenią nazw (""), a jej wartością jest węzeł tekstowy zawierający ciąg "hello, world!".

Jednym ze sposobów tworzenia złożonych rozszerzeń elementów składających się z wielu zagnieżdżonych elementów jest użycie interfejsów API programu .NET Framework do serializacji (zarówno DataContractSerializer tych, jak i XmlSerializer obsługiwanych), jak pokazano w poniższych przykładach.

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

W tym przykładzie wartości DataContractExtension i XmlSerializerExtension są typami niestandardowymi napisanymi do użytku z serializatorem.

Klasa SyndicationElementExtensionCollection może również służyć do tworzenia rozszerzeń elementów na XmlReader podstawie wystąpienia. Umożliwia to łatwą integrację z interfejsami API przetwarzania XML, takimi jak XElement pokazano w poniższym przykładowym kodzie.

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

Odczytywanie danych rozszerzenia

Wartości rozszerzeń atrybutów można uzyskać, wyszukując atrybut w AttributeExtensions kolekcji, XmlQualifiedName jak pokazano w poniższym przykładowym kodzie.

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

Dostęp do rozszerzeń elementów jest uzyskiwany przy użyciu ReadElementExtensions<T> metody .

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

Istnieje również możliwość uzyskania rozszerzenia XmlReader poszczególnych elementów przy użyciu GetReader() metody .

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

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.

Zobacz też