Exemplo de extensões vagamente tipadas

O exemplo LooselyTypedExtensions ilustra as técnicas básicas para trabalhar com dados de extensão.

O modelo de objeto Syndication fornece suporte avançado para trabalhar com dados de extensão — informações que estão presentes na representação XML de um feed de distribuição, mas não são explicitamente expostas por classes como SyndicationFeed e SyndicationItem.

O exemplo usa a SyndicationFeed classe para os fins do exemplo. No entanto, os padrões demonstrados neste exemplo podem ser usados com todas as classes Syndication que suportam dados de extensão:

SyndicationFeed

SyndicationItem

SyndicationCategory

SyndicationPerson

SyndicationLink

XML de exemplo

Para referência, o seguinte documento XML é usado neste exemplo.

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

Este documento contém os seguintes dados de extensão:

  • O myAttribute atributo do <feed> elemento .

  • <simpleString> elemento.

  • <DataContractExtension> elemento.

  • <XmlSerializerExtension> elemento.

  • <xElementExtension> elemento.

Gravando dados de extensão

As extensões de atributo são criadas adicionando entradas à coleção, AttributeExtensions conforme mostrado no código de exemplo a seguir.

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

As extensões de elemento são criadas adicionando entradas à ElementExtensions coleção. Essas extensões podem ser feitas por valores básicos, como cadeias de caracteres, serializações XML de objetos do .NET Framework ou nós XML codificados manualmente.

O código de exemplo a seguir cria um elemento de extensão chamado simpleString.

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

O namespace XML para este elemento é o namespace vazio ("") e seu valor é um nó de texto que contém a cadeia de caracteres "hello, world!".

Uma maneira de criar extensões de elementos complexos que consistem em muitos elementos aninhados é usar as APIs do .NET Framework para serialização (ambas as DataContractSerializer e as XmlSerializer são suportadas), conforme mostrado nos exemplos a seguir.

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

Neste exemplo, os DataContractExtension tipos e XmlSerializerExtension são personalizados escritos para uso com um serializador.

A SyndicationElementExtensionCollection classe também pode ser usada para criar extensões de elemento a partir de uma XmlReader instância. Isso permite uma fácil integração com APIs de processamento XML, como XElement mostrado no código de exemplo a seguir.

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

Lendo dados de extensão

Os valores para extensões de atributo podem ser obtidos pesquisando o AttributeExtensions atributo na coleção por ele, XmlQualifiedName conforme mostrado no código de exemplo a seguir.

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

As extensões de elemento são acessadas usando o ReadElementExtensions<T> método.

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

Também é possível obter extensões de XmlReader elementos individuais usando o GetReader() método.

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

Para configurar, compilar e executar o exemplo

  1. Certifique-se de ter executado o procedimento de instalação única para os exemplos do Windows Communication Foundation.

  2. Para criar a edição C# ou Visual Basic .NET da solução, siga as instruções em Criando os exemplos do Windows Communication Foundation.

  3. Para executar o exemplo em uma configuração de máquina única ou cruzada, siga as instruções em Executando os exemplos do Windows Communication Foundation.

Consulte também