2010-07-14 2 views
7

doc.Load() 동안 '루트 요소 없음'이라는 메시지가 나옵니다.루트 요소 없음 - XmlTextWriter를 사용하여 Xmldocument 만들기

MemoryStream stream = new MemoryStream(); 
XmlTextWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8); 
xmlWriter.Formatting = System.Xml.Formatting.Indented; 
xmlWriter.WriteStartDocument(); 
xmlWriter.WriteStartElement("Root"); 
XmlDocument doc = new XmlDocument(); 
stream.Position = 0; 
doc.Load(stream); 
xmlWriter.Close(); 

문제를 파악할 수 없습니다. 어떤 통찰력?

+2

(꼭 필요한 것은 아니지만,'MemoryStream'과'XmlTextWriter' 객체 모두에'using' 블록으로 코드를 래핑 할 수 있습니다 - 그들은 모두 IDisposable입니다.) – stakx

답변

13

xmlWriter을 플러시하지 않았으므로 아직 아무 것도 쓰지 않았을 수 있습니다. 또한, 당신은 결코 루트 요소를 완료하지있어, 그래서 이있는 경우에도는 닫는 태그를 작성하지 않습니다

<Root> 

을 작성. 전체 문서으로로드하려고합니다.

XmlWriter 실제로은 요소의 시작 부분을 어쨌든 씁니다. 속성을 쓸 수도 있다는 것을 잊지 마십시오. 당신이 가진 코드로 쓸 수있는 최대량은 <Root입니다. 여기

가 작동하는 완전한 프로그램입니다 : (. 내가 WriteEndDocument를 호출 아니에요 주 - 당신은 여전히 ​​열려있는 요소 나 속성이있는 경우 필요한 것 같다)

using System; 
using System.IO; 
using System.Text; 
using System.Xml; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      XmlTextWriter xmlWriter = new XmlTextWriter(stream, Encoding.UTF8); 
      xmlWriter.Formatting = System.Xml.Formatting.Indented; 
      xmlWriter.WriteStartDocument(); 
      xmlWriter.WriteStartElement("Root"); 
      xmlWriter.WriteEndElement(); 
      xmlWriter.Flush(); 

      XmlDocument doc = new XmlDocument(); 
      stream.Position = 0; 
      doc.Load(stream); 
      doc.Save(Console.Out); 
     } 
    } 
} 

+0

순서는 : .Close() .Flush()보다 일반적으로 정확하지 않습니까? – annakata

+0

@annalata : 나는 우리가 여기서하고 싶지 않은 스트림을 닫을 것이라고 생각합니다. 보통 나는 다만 작가를 처분 할 것입니다. –

0

무엇을 @ 스키트는 당신이 당신의 요소를 닫습니다하지 않는 것, 말했다 플러스 :

xmlWriter.WriteEndElement(); 
+0

나는 두 번째 문장에서 그것을 다루었 다. :) –

+0

실은 당신이 했었지만 * 스텔스 모드 * - 왜 내가 그것을 놓쳤을지를 내가 이해할 수있는 유일한 이유 다. :) – Robaticus

0

그럼 난 당신이 문서를 시작,하지만 난 당신에게 ending 그것을 또는 012이 표시되지 않는 참조... (적어도 사용하기 전에는)

관련 문제