2013-11-25 3 views
0

의 내가 (사실, 이것은 셰어 프로젝트는) 다음과 같은 XML을 생성하는 제 3 자 라이브러리가 있다고 가정 해 봅시다 :XDocument.CreateWriter 메서드를 사용하는 방법?

<webParts> 
    <webPart xmlns="http://schemas.microsoft.com/WebPart/v3"> 
     <metaData> 
      <type name="SomeType, SomeAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ecb5ce1bdfc30252" /> 
      <importErrorMessage>Impossible d’importer ce composant WebPart.</importErrorMessage> 
     </metaData> 
     <data> 
      <properties> 
       <property name="DataFields" type="string" /> 
       <property name="XmlDefinitionLink" type="string" /> 
       <property name="FilterIncludeChildren3" type="bool">False</property> 

      </properties> 
     </data> 
    </webPart> 
</webParts> 

이 XML은 XmlTextWriter 인수를 받아들이는 메소드를 호출하여 생성된다. 예상대로이가 작동

var sb = new StringBuilder(); 
using(var sw = new StringWriter(sb)) 
using (var xw = new XmlTextWriter(sw)) 
{ 
    sourceMgr.ExportWebPart(webPartToClone, xw); 
} 
var wpAsXml = XDocument.Parse(sb.ToString()); 

: 내가 XDocument 개체를 작업 할 때, 나는이 코드를 사용합니다. 그러나, 코드 라인의 수를 줄이기 위해, 나는이 코드를 시도 :

var wpAsXml = new XDocument(); 
sourceMgr.ExportWebPart(webPartToClone, wpAsXml.CreateWriter()); 

을하지만이 코드는 다음과 같은 오류와 함께 실패합니다

System.Xml.XmlException: The prefix '' cannot be redefined from '' to 'http://schemas.microsoft.com/WebPart/v3' within the same start element tag. 
    at System.Xml.XmlWellFormedWriter.PushNamespace(String prefix, String ns, Boolean explicitlyDefined) 
    at System.Xml.XmlWellFormedWriter.WriteEndAttribute() 
    at System.Web.UI.WebControls.WebParts.WebPartManager.ExportWebPart(WebPart webPart, XmlWriter writer) 
    at Microsoft.SharePoint.WebPartPages.SPWebPartManager.ExportWebPartInternal(WebPart webPart, XmlWriter writer) 
    at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.ExportWebPart(WebPart webPart, XmlWriter writer) 
    at SomeWhereInMycode 

왜 두번째 코드는 작동하지 않는 이유는 무엇입니까? 이 방법을 사용하는 적절한 방법은 무엇입니까?

추신 : 익명 : 3.5 SP1

+1

이 코드는 XmlWellFormedWriter의 버그 일 뿐이며,이 코드는 .NET 4에서 크게 수정되었습니다. 해결 방법이 있습니다. –

답변

0

시나리오를 로컬로 다시 만들 수 없습니다. 그래서 이것은 어둠 속에서의 총입니다. 범위 지정 문제 일 수 있습니다.

XNamespace wp = "http://schemas.microsoft.com/WebPart/v3"; 

XDocument wpAsXml = new XDocument(new XDeclaration("1.0", "utf-8", "true"), 
            new XElement(wp + "webParts"));  

using (XmlWriter writer = wpAsXml.CreateWriter()) 
{ 
    sourceMgr.ExportWebPart(webPartToClone, writer); 
} 
+0

제안 해 주셔서 감사합니다.하지만 불행히도 동작은 완전히 동일합니다. –

+0

@SteveB 네임 스페이스로 새 편집을보십시오. – OmegaMan

관련 문제