Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O exemplo LooselyTypedExtensions ilustra as técnicas básicas para trabalhar com dados de extensão.
O modelo de objeto Sindicalização fornece suporte avançado para trabalhar com dados de extensão — informações presentes na representação XML de um feed de sindicalização, mas não explicitamente expostas por classes como SyndicationFeed e SyndicationItem.
O exemplo usa a SyndicationFeed classe para fins do exemplo. No entanto, os padrões demonstrados neste exemplo podem ser usados com todas as classes de distribuição que dão suporte a dados de extensão.
XML de exemplo
Para referência, o documento XML a seguir é 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 as seguintes partes de dados de extensão:
O
myAttributeatributo do<feed>elemento.<simpleString>elemento.<DataContractExtension>elemento.<XmlSerializerExtension>elemento.<xElementExtension>elemento.
Gravar dados de extensão
As extensões de atributo são criadas adicionando entradas à AttributeExtensions coleção, 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 incluir valores básicos, como cadeias de caracteres, serializações XML de objetos .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 esse elemento é o namespace vazio ("") e seu valor é um nó de texto que contém a cadeia de caracteres "olá, mundo!".
Uma maneira de criar extensões de elementos complexos que consistem em muitos elementos aninhados é usar as APIs do .NET Framework para serialização (tanto o DataContractSerializer quanto os XmlSerializer que têm suporte), 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 e XmlSerializerExtension são tipos personalizados escritos para uso com um serializador.
A SyndicationElementExtensionCollection classe também pode ser usada para criar extensões de elemento de uma XmlReader instância. Isso permite uma integração fácil 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());
Gravar dados de extensão
Os valores das extensões de atributo podem ser obtidos pesquisando o atributo na coleção AttributeExtensions pelo seu 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 um XmlReader em uma extensão de elemento individual usando o método GetReader().
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
Verifique se você executou o Procedimento de instalação avulsa dos exemplos do Windows Communication Foundation.
Para compilar a edição .NET do C# ou do Visual Basic da solução, siga as instruções contidas em Como Compilar as Amostras do Windows Communication Foundation.
Para executar o exemplo em uma configuração única ou entre máquinas, siga as instruções em Executando os exemplos do Windows Communication Foundation.