2009-11-24 3 views
1

.NET SyndicationFeed 클래스를 사용 중이며 SyndicationItem.ElementExtensions.Add()를 사용하여 내 고유 확장명을 추가하고 SyndicationItem.Content를 일부 XML 컨텐트로 설정했습니다..NET SyndicationFeeds에 대한 사용자 지정 확장과 함께 xmlns 네임 스페이스를 어떻게 올바르게 사용합니까?

내 문제는 내 네임 스페이스가 XML 출력에 여러 번 표시된다는 것입니다. 이상적으로는 루트 노드에 xmlns 속성을 적용하고 문서 전체에서 해당 별칭을 사용합니다.

here처럼 SyndicationFeed.AttributeExtensions를 사용하여 설명하는 예제를 보았습니다. 예 :

feed.AttributeExtensions.Add(
    new System.Xml.XmlQualifiedName("myns", "http://www.w3.org/2000/xmlns"), 
    "http://myNamespace.com"); 

그러나이 예제는 나중에 네임 스페이스를 활용하는 방법을 보여주지 않습니다. 예를 들어 피드를 확장하는 두 가지 방법은 다음과 같습니다.

XNamespace myNs = "http://myNamespace.com"; 
SyndicationItem item = new SyndicationItem(); 

XElement myMetadata = new XElement(myNs + "metadata"); 
myMetadata.Add(new XElement(myNs + "meta1", "value1")); 
myMetadata.Add(new XElement(myNs + "meta2", "value2")); 
item.Content = SyndicationContent.CreateXmlContent(myMetadata); 

XElement myExtensions = new XElement(myNs + "myExtensions"); 
myExtensions.Add(new XElement(myNs + "ext1", "value1")); 
myExtensions.Add(new XElement(myNs + "ext2", "value2")); 
item.ElementExtensions.Add(myExtensions); 

잘하면 나는 간단한 것을 놓치고 있습니다. 더 위의 AttribuetExtensions.Add() 메소드로, 내 피드는 초기 XML에 대해 다음과 같습니다

<?xml version="1.0" encoding="utf-8"?> 
<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0"> 
    <channel p3:myns="http://myNamespace.com" xmlns:p3="http://www.w3.org/2000/xmlns"> 

부여, 나는, myns의 XMLNS 루트 RSS 노드가 아닌 채널에서하는 것이 원합니다 하지만 나는 그 채널에 함께 살 수 있습니다.

물론
<item> 
    ...  
    <a10:content type="text/xml"> 
     <metadata xmlns="http://myNamespace.com"> 
      <meta1>value1</meta2> 
      <meta2>value2</meta2> 
     </metadata> 
    </a10:content> 
    <myExtensions xmlns="http://myNamespace.com"> 
     <ext1>value1</ext1> 
     <ext2>value2</ext2> 
    </myExtensions> 
</item> 

, 내가보고 선호하는 것 것은 :

<item> 
    ...  
    <a10:content type="text/xml"> 
     <myns:metadata> 
      <meta1>value1</meta2> 
      <meta2>value2</meta2> 
     </myns:metadata> 
    </a10:content> 
    <myns:myExtensions> 
     <ext1>value1</ext1> 
     <ext2>value2</ext2> 
    </myns:myExtensions> 
</item> 

와 SyndicationFeed.AttributeExtensions에 의해 정의 된 네임 스페이스를 연결하는 특별한 방법이 있나요처럼 불행하게도, 신디케이션 항목 XML 보인다 SyndicationItem을 확장 할 때 사용되는 것?

답변

1

당신과 같이 공급에 대한 네임 스페이스를 decalre 할 수 있습니다 :

new XmlQualifiedName("rdf", "http://www.w3.org/2000/xmlns/"), "http://www.w3.org/1999/02/22-rdf-syntax-ns#"); 

그런 다음 당신은 당신의 XNamespace를 선언하고 요소 생성에 사용할 수 있습니다.

XNamespace Rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"; 
item.ElementExtensions.Add(
    new XElement(Rdf + "type", 
    new XAttribute(Rdf + "resource", "attribute value"))); 

rdf 요소에 대해 여기를 만들었지 만 모든 사용자 정의 유형에 대해 만들 수 있습니다. SyndicationFeed 및 SyndicationItem의 확장 메서드에 네임 스페이스의 생성을 추가 할 수도 있습니다.

public static void SetNamespace(this SyndicationFeed feed, string prefix, string nsUri) 
{ 
    feed.AttributeExtensions.Add(new XmlQualifiedName(prefix, "http://www.w3.org/2000/xmlns/"), nsUri); 
} 

public static void SetNamespace(this SyndicationItem item, string prefix, string nsUri) 
{ 
    item.AttributeExtensions.Add(new XmlQualifiedName(prefix, "http://www.w3.org/2000/xmlns/"), nsUri); 
}