Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пример LooselyTypedExtensions демонстрирует основные приёмы работы с данными расширения.
Объектная модель Syndication обеспечивает широкую поддержку работы с данными расширения — сведениями, которые присутствуют в XML-представлении канала синдикации, но явно не предоставляются классами, такими как SyndicationFeed и SyndicationItem.
В примере используется SyndicationFeed класс для целей примера. Однако шаблоны, показанные в этом примере, можно использовать со всеми классами Синдикации, поддерживающими данные расширения:
Пример 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());
}
Настройка, сборка и запуск примера
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.