느슨한 형 확장 샘플
LooselyTypedExtensions 샘플은 확장 데이터 작업을 위한 기본 기술을 보여 줍니다.
배포 개체 모델은 확장 데이터, 즉 배포 피드의 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>
이 문서에는 다음과 같은 확장명 데이터가 포함되어 있습니다.
<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를 사용하는 것입니다. 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
은 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());
}
샘플을 설치, 빌드 및 실행하려면
Windows Communication Foundation 샘플의 일회 설치 절차를 수행했는지 확인합니다.
C# 또는 Visual Basic .NET 버전의 솔루션을 빌드하려면 Building the Windows Communication Foundation Samples의 지침을 따릅니다.
단일 컴퓨터 또는 다중 컴퓨터 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플 실행의 지침을 따릅니다.