Ejemplo de extensiones débilmente tipadas
En el ejemplo LooselyTypedExtensions se muestran las técnicas básicas para trabajar con datos de extensión.
El modelo de objetos de sindicación proporciona compatibilidad enriquecida para trabajar con datos de extensión (información que está presente en una representación XML de una fuente de sindicación pero no explícitamente expuesta por clases como SyndicationFeed y SyndicationItem.
El ejemplo utiliza la clase SyndicationFeed para el ejemplo. Sin embargo, los modelos mostrados en este ejemplo se pueden utilizar con todas las clases de sindicación que admiten datos de extensión:
XML de ejemplo
Como referencia, el siguiente documento XML se usa en este ejemplo:
<?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 contiene las siguientes partes de datos de extensión:
Atributo
myAttribute
del elemento<feed>
.Elemento
<simpleString>
.Elemento
<DataContractExtension>
.Elemento
<XmlSerializerExtension>
.Elemento
<xElementExtension>
.
Cómo escribir datos de extensión
Las extensiones de atributo se crean agregando entradas a la colección AttributeExtensions tal y como se muestra en el código de ejemplo siguiente.
//Attribute extensions are stored in a dictionary indexed by
// XmlQualifiedName
feed.AttributeExtensions.Add(new XmlQualifiedName("myAttribute", ""), "someValue");
Las extensiones de elemento se crean agregando entradas a la colección ElementExtensions. Estas extensiones pueden ser valores básicos como cadenas, serializaciones XML de objetos .NET Framework o nodos XML codificados a mano.
El código de ejemplo siguiente crea un elemento de extensión denominado simpleString
.
feed.ElementExtensions.Add("simpleString", "", "hello, world!");
El espacio de nombres XML para este elemento es el espacio de nombres vacío ("") y su valor es un nodo de texto que contiene la cadena "hello, world!".
Una manera de crear extensiones de elemento complejas que consten de muchos elementos anidados es utilizar las API de .NET Framework para la serialización (se admiten DataContractSerializer y XmlSerializer) tal como se muestra en los ejemplos siguientes.
feed.ElementExtensions.Add( new DataContractExtension() { Key = "X", Value = 4 } );
feed.ElementExtensions.Add( new XmlSerializerExtension { Key = "Y", Value = 8 }, new XmlSerializer( typeof( XmlSerializerExtension ) ) );
En este ejemplo, DataContractExtension
y XmlSerializerExtension
son tipos personalizados escritos para su uso con un serializador.
La clase SyndicationElementExtensionCollection también se puede utilizar para crear extensiones de elemento a partir de una instancia XmlReader. Esto permite la fácil integración con las API de procesamiento de XML como XElement tal y como se muestra en el código de ejemplo siguiente.
feed.ElementExtensions.Add(new XElement("xElementExtension",
new XElement("Key", new XAttribute("attr1", "someValue"), "Z"),
new XElement("Value", new XAttribute("attr1", "someValue"),
"15")).CreateReader());
Lectura de datos de la extensión
Los valores para las extensiones de atributo se pueden obtener buscando el atributo en la colección AttributeExtensions por su XmlQualifiedName tal y como se muestra en el código de ejemplo siguiente.
Console.WriteLine( feed.AttributeExtensions[ new XmlQualifiedName( "myAttribute", "" )]);
Se tiene acceso a las extensiones de elemento utilizando el 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());
}
También es posible obtener un XmlReader
en las extensiones de elemento individuales utilizando el 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());
}
Configurar, compilar y ejecutar el ejemplo
Asegúrese de que ha realizado el procedimiento de instalación única para los ejemplos de Windows Communication Foundation.
Para compilar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Building the Windows Communication Foundation Samples.
Para ejecutar el ejemplo en una configuración de una sola máquina o de varias máquinas, siga las instrucciones que se indican en Ejecución de los ejemplos de Windows Communication Foundation.