Поделиться через


Пример слабо типизированных расширений

Пример LooselyTypedExtensions иллюстрирует основные методы работы с данными расширения.

Объектная модель синдикации обеспечивает широкую поддержку работы с данными расширения - информацией, присутствующей в XML-представлении канала синдикации, но не предоставляемой в явном виде такими классами, как SyndicationFeed и SyndicationItem.

В этом примере используется класс SyndicationFeed. Однако показанные в примере шаблоны можно использовать со всеми классами Syndication, которые поддерживают данные расширения:

SyndicationFeed

SyndicationItem

SyndicationCategory

SyndicationPerson

SyndicationLink

Образец XML

Для справки: в этом примере используется следующий 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>

Этот документ содержит следующие части данных расширения:

  • Атрибут myAttribute элемента <feed>.

  • Элемент <simpleString>.

  • Элемент <DataContractExtension>.

  • Элемент <XmlSerializerExtension>.

  • Элемент <xElementExtension>.

Запись данных расширений

Расширения атрибутов создаются путем добавления записей в коллекцию AttributeExtensions, как показано в следующем образце кода.

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

Расширения элементов создаются путем добавления записей в коллекцию ElementExtensions. Эти расширения могут быть базовыми значениями, такими как строки, XML-сериализациями объектов платформы .NET Framework или XML-узлами, код которых написан вручную.

В следующем примере кода создается элемент расширения с именем simpleString.

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

Пространство имен XML для этого элемента является пустым пространством имен (""), а его значением является текстовый узел, содержащий строку "hello, world!".

Одним из способов создания расширений сложных элементов, содержащий много вложенных элементов, является использование для сериализации интерфейсов API платформы .NET Framework (поддерживаются как DataContractSerializer, так и XmlSerializer), как показано в следующих примерах.

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

В этом примере DataContractExtension и XmlSerializerExtension представляют собой пользовательские типы, созданные для использования с сериализатором.

Класс SyndicationElementExtensionCollection также может использоваться для создания расширений элементов из экземпляра XmlReader. Это обеспечивает простую интеграцию с интерфейсами API, обрабатывающими XML, такими как XElement, как показано в следующем образце кода.

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

Чтение данных расширений

Значения для расширений атрибутов можно получить, произведя поиск атрибута в коллекции AttributeExtensions по его имени XmlQualifiedName, как показано в следующем образце кода.

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

Для доступа к расширениям элементов служит метод 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());
}

Можно также получить средство чтения XmlReader для расширений отдельных элементов с помощью метода GetReader().

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

Настройка, сборка и выполнение образца

  1. Убедитесь, что вы выполнили процедуру однократной установки для примеров Windows Communication Foundation.

  2. Чтобы создать выпуск решения на языке C# или Visual Basic .NET, следуйте инструкциям в разделе Building the Windows Communication Foundation Samples.

  3. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".

См. также