다음을 통해 공유


느슨한 형 확장 샘플

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>

이 문서에는 다음과 같은 확장명 데이터가 포함되어 있습니다.

  • <feed>요소의 myAttribute 특성입니다.

  • <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 serialization 또는 직접 코딩한 XML 노드와 같은 기본값이 될 수 있습니다.

다음 샘플 코드는 simpleString이라는 확장명 요소를 만듭니다.

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

이 요소의 XML 네임스페이스는 빈 네임스페이스("")이며 값은 문자열 "hello, world!"를 포함하는 텍스트 노드입니다.

여러 개의 중첩 요소로 구성된 복합 요소 확장을 만드는 한 가지 방법은 다음 예제에 나온 것처럼 serialization을 위한 .NET Framework API를 사용하는 것입니다. DataContractSerializerXmlSerializer가 모두 지원됩니다.

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

이 예제에서 DataContractExtensionXmlSerializerExtension은 serializer와 함께 사용하도록 작성된 사용자 지정 형식입니다.

또한 SyndicationElementExtensionCollection 클래스를 사용하여 XmlReader 인스턴스에서 요소 확장을 만들 수도 있습니다. 이 경우에는 다음 샘플 코드에서와 같이 XElement와 같은 XML 처리 API와 손쉽게 통합할 수 있습니다.

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 샘플 실행의 지침을 따릅니다.

참고 항목