松散类型化扩展示例

LooselyTypedExtensions 示例演示了使用扩展数据的基本技术。

联合对象模型为处理扩展数据(在联合源的 XML 表示形式中存在,但是未由 SyndicationFeedSyndicationItem 等类显式公开的信息)提供了丰富的支持。

该示例将 SyndicationFeed 类用于示例。 但是,此示例中演示的模式可用于支持扩展数据的所有联合类:

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 集合来创建元素扩展。 这些扩展可以通过基本值(如字符串、.NET Framework 对象的 XML 序列化或手动编码的 XML 节点)来表示。

以下示例代码创建一个名为 simpleString 的扩展元素。

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

此元素的 XML 命名空间是空命名空间(“”),其值是包含字符串“hello, world!”的文本节点。

创建包含许多嵌套元素的复杂元素扩展的一种方法是使用 .NET Framework API 进行序列化(同时 DataContractSerializer 支持和 XmlSerializer 受支持),如以下示例所示。

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

在此示例中,DataContractExtensionXmlSerializerExtension 是为序列化程序编写的自定义类型。

SyndicationElementExtensionCollection 类还可用于从 XmlReader 实例创建元素扩展。 这允许与 XML 处理 API 轻松集成,如 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 示例 执行One-Time 安装过程。

  2. 若要生成解决方案的 C# 或 Visual Basic .NET 版本,请按照 生成 Windows Communication Foundation 示例中的说明进行操作。

  3. 若要在单台计算机或跨计算机配置中运行示例,请按照 运行 Windows Communication Foundation 示例中的说明进行操作。

另请参阅