2013-04-05 2 views
0

내가 설명한 것과 비슷한 문제를 해결하려고합니다. How to check name of element with WriteEndElement다른 내부에서 XmlWriter를 사용하는 방법?

이 코드를 내부 및 외부 XmlWriter로 작성했습니다. 아이디어는 내부 XmlWriter를 닫으면 신뢰할 수없는 타사 라이브러리에 매달린 모든 태그도 닫힙니다.

var sb = new StringWriter(); 

using (var xml = XmlWriter.Create(sb, new XmlWriterSettings(){Indent = true})) 
{ 
    xml.WriteStartElement("root"); 

    using (var inner = XmlWriter.Create(xml)) 
    { 
     inner.WriteStartElement("payload1"); 

     // simulate ThirdPartyLibrary.Serialise(results, inner) leaving a tag open 
     inner.WriteStartElement("third-party-stuff"); 
    } 

    xml.WriteStartElement("payload2"); 
} 

sb.ToString().Dump(); 

나는이

<root> 
    <payload1> 
    <third-party-stuff /> 
    </payload1> 
    <payload2 /> 
</root> 

생산 것으로 예상하지만 그 대신 나는 <payload2>

InvalidOperationException이
작가가 닫혀 나에 작성해야 라인에서 런타임 오류 오류 상태.

왜이 오류가 발생합니까? 나는 내부 XmlWriter를 닫아서 바깥 쪽을 닫지 않을 것이라고 기대하지 않았다.

+0

는 (결과 내부) 그것은 당신의 ThirdPartyLibrary.Serialise 내부에 폐쇄되지 않는다는 것을 확신; 메서드 호출? – Penfold

+0

@Penfold 좋은 지적. 위 예제를 변경하여 실행할 수 있습니다. –

답변

2

코드 샘플에서 변수 이름을 사용하면 XmlWriter 내부를 닫으면 (외부) XmlWriter xml이 해제됩니다. this에 따라 예상되는 동작입니다. XmlWriter를 삭제하는 MSDN 항목은 "XmlWriter 클래스의 현재 인스턴스에서 사용하는 모든 리소스를 해제합니다."즉 새로 만든 XMLWriter를 해제합니다.

이러한 코드는 코드 분석 오류 CA2202를 생성합니다. 이러한 상황에 대한 해결책은 다음 link에 설명되어 있습니다.

static void Main(string[] args) 
{ 
    var sb = new StringWriter(); 
    using (var xml = XmlWriter.Create(sb, new XmlWriterSettings() { Indent = true })) 
    { 
     xml.WriteStartElement("root"); 
     using (var inner = XmlWriter.Create(xml)) 
     { 
      Debug.WriteLine(Object.ReferenceEquals(xml, inner)); 
      //UH OH! Returns true 
      inner.WriteStartElement("payload1"); 
      // simulate ThirdPartyLibrary.Serialise(results, inner) leaving a tag open 
      inner.WriteStartElement("third-party-stuff"); 
     } 
     xml.WriteStartElement("payload2"); 
    } 
    sb.ToString().Dump(); 
} 

참조 : 당신이 xml에서 다른 XmlWriter을 만들 때

1

체크 아웃은 어떻게되는지? 따라서 inner을 처분 할 때 동일한 개체이기 때문에 실제로는 xml을 처분합니다.

당신은 MSDN 확인하는 경우 : (http://msdn.microsoft.com/en-us/library/77t6e4w3.aspx)

반환 값 형식 : 지정된 XmlWriter를 객체 감싸

입니다

System.Xml.XmlWriter에 XmlWriter를 개체를.

그래서 같은 개체를 사용한다고 가정합니다. 여기

편집는 솔루션은 다음을 사용할 수 있습니다

static void Main(string[] args) 
    { 
     var sb = new StringWriter(); 
     var sb2 = new StringWriter(); 

     using (var xml = XmlWriter.Create(sb, new XmlWriterSettings() { Indent = true })) 
     { 
      xml.WriteStartElement("root"); 

      using (var inner = XmlWriter.Create(sb2, new XmlWriterSettings() {Indent = true , CloseOutput=true, OmitXmlDeclaration=true})) 
      { 

       inner.WriteStartElement("payload1"); 
       inner.WriteStartElement("third-party-stuff"); 
      } 

      xml.WriteRaw(sb2.ToString()); 

      xml.WriteStartElement("payload2"); 
     } 

     Debug.WriteLine(sb.ToString());    
    } 
관련 문제