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 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 classe SyndicationFeed para exemplificar. No entanto, os padrões demonstrados neste exemplo podem ser usados com todas as classes da Sindicalizaçã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 atributo
myAttribute
do elemento<feed>
.Elemento
<simpleString>
.Elemento
<DataContractExtension>
.Elemento
<XmlSerializerExtension>
.Elemento
<xElementExtension>
.
Gravar 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 à coleção ElementExtensions. 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 de 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 de .NET Framework para serialização (tanto DataContractSerializer quanto XmlSerializer possuem 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, o DataContractExtension
e o XmlSerializerExtension
são tipos personalizados escritos para uso com um serializador.
A classe SyndicationElementExtensionCollection também pode ser usada para criar extensões de elemento de uma instância XmlReader. Isso permite uma integração fácil com APIs de processamento XML, como XElement, conforme 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 por 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 método 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());
}
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 única para os 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 de computador único ou de vários computadores, siga as instruções em Como executar os exemplos do Windows Communication Foundation.