2013-05-19 4 views
0

내 요구 사항은 xml 파일을 만들고 xml 요소를 기존 xml 파일에 추가하는 것입니다.단일 xml 파일에서 두 xml 선언 오류

먼저 다음 코드로 새 xml 파일을 만들려고했습니다.

using (XmlWriter xmlWriter = XmlWriter.Create(fStream, xmlSettings)) 
{ 
    xmlWriter.WriteStartDocument(true); 
    xmlWriter.WriteStartElement("Friends"); 
    xmlWriter.WriteStartElement("Friend"); 
    xmlWriter.WriteElementString("Name", "Safiq"); 
    xmlWriter.WriteElementString("Like", "Char"); 
    xmlWriter.WriteElementString("Unlike", "anger"); 
    xmlWriter.WriteElementString("Nickname", "good"); 
    xmlWriter.WriteElementString("Gift", "c#"); 
    xmlWriter.WriteEndElement(); 
    xmlWriter.WriteEndElement(); 
    xmlWriter.WriteEndDocument(); 
    xmlWriter.Flush(); 
} 

다음 기존 파일에 새 요소를 추가했습니다.

XDocument XDOC = XDocument.Load(fStream); 
XElement x = new XElement("Friend"); 
x.Add(new XElement("Name", "Safiq")); 
x.Add(new XElement("Like", "Char")); 
x.Add(new XElement("Unlike", "anger")); 
x.Add(new XElement("Nickname", "good")); 
x.Add(new XElement("Gift", "c#")); 
XDOC.Descendants("Friends").Single().Add(x); 
XDOC.Save(fStream); 

그러나 다음 출력이 표시됩니다.

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Friends> 
    <Friend> 
     <Name>Safiq</Name> 
     <Like>Char</Like> 
     <Unlike>anger</Unlike> 
     <Nickname>good</Nickname> 
     <Gift>c#</Gift> 
    </Friend> 
</Friends> 
<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<Friends> 
    <Friend> 
     <Name>Safiq</Name> 
     <Like>Char</Like> 
     <Unlike>anger</Unlike> 
     <Nickname>good</Nickname> 
     <Gift>c#</Gift> 
    </Friend> 
    <Friend> 
     <Name>Safiq</Name> 
     <Like>Char</Like> 
     <Unlike>anger</Unlike> 
     <Nickname>good</Nickname> 
     <Gift>c#</Gift> 
    </Friend> 
</Friends> 

어디가 잘못 되었나요?

답변

4

로드하는 데 동일한 스트림을 사용하고 있습니다. 로드가 끝나면 스트림이 파일 끝에 배치되므로 나중에 파일을 저장하면 해당 위치에서 저장됩니다.

난 당신이 파일을 저장 파일, 다음 다른 using 문을 문서를로드하고 종료하는 using 문이 제안 : 당신은 .... 다시 사용하여 동일한 파일 스트림입니다

XDocument doc; 
using (var stream = ...) 
{ 
    doc = XDocument.Load(stream); 
} 
// Manipulate doc 
using (var stream = ...) 
{ 
    doc.Save(stream); 
} 
+0

고마워요이다. 그것은 나의 시간을 절약했다. !! –

+0

stream.position = 0;을 추가하면 오류가 발생합니까? –

+0

@Shafiq : 항상 데이터를 추가하는 것은 아닙니다. 그러나 데이터를 제거하기 위해 코드를 변경 한 경우 끝에 남은 데이터로 인해 잘못된 XML 파일이 생성됩니다. 나는 대신 신선한 물줄기를 사용했다. –

1

XDocument XDOC = XDocument.Load(fStream); 
... (nothing with fStream) 
XDOC.Save(fStream); 

원본의 뒤에 새 (올바르게 변경된) 문서를 추가합니다.

1

당신이해야 할 모든 위치는 내용의 시작 부분으로 스트림

using (XmlWriter xmlWriter = XmlWriter.Create(fStream, xmlSettings)) 
{ 
    xmlWriter.WriteStartDocument(true); 
    xmlWriter.WriteStartElement("Friends"); 
    xmlWriter.WriteStartElement("Friend"); 
    xmlWriter.WriteElementString("Name", "Safiq"); 
    xmlWriter.WriteElementString("Like", "Char"); 
    xmlWriter.WriteElementString("Unlike", "anger"); 
    xmlWriter.WriteElementString("Nickname", "good"); 
    xmlWriter.WriteElementString("Gift", "c#"); 
    xmlWriter.WriteEndElement(); 
    xmlWriter.WriteEndElement(); 
    xmlWriter.WriteEndDocument(); 
    xmlWriter.Flush(); 
} 

// Reposition The stream 
fStream.Position=0; 

XDocument XDOC = XDocument.Load(fStream); 
XElement x = new XElement("Friend"); 
x.Add(new XElement("Name", "Safiq")); 
x.Add(new XElement("Like", "Char")); 
x.Add(new XElement("Unlike", "anger")); 
x.Add(new XElement("Nickname", "good")); 
x.Add(new XElement("Gift", "c#")); 
XDOC.Descendants("Friends").Single().Add(x); 
XDOC.Save(fStream); 
+0

그게 아주 간단. 감사 –