2010-04-15 9 views
3

형식을 변경하지 않고 추가하려는 기존 XML 파일이 있습니다. 기존 파일은 다음과 같습니다기존 XML 파일 추가

<Clients> 
    <User username="farstucker"> 
    <UserID>1</UserID> 
    <DOB /> 
    <FirstName>Steve</FirstName> 
    <LastName>Lawrence</LastName> 
    <Location>NYC</Location> 
    </User> 
</Clients> 

어떻게이 형식을 사용하여 다른 사용자를 추가 할 수 있습니까? 내 기존의 코드는 다음과 같습니다

 string fileLocation = "clients.xml"; 

     XmlTextWriter writer; 

     if (!File.Exists(fileLocation)) 
     { 
      writer = new XmlTextWriter(fileLocation, null); 
      writer.WriteStartDocument(); 

      // Write the Root Element 
      writer.WriteStartElement("Clients"); 

      // End Element and Close 
      writer.WriteEndElement(); 
      writer.Close(); 
     } 
// Append new data here 

필자가 나는 파일을 엉망으로하지 않고 기존의 형식 (빈 태그)를 유지할 수있는 경우 데이터하지만 임 확실하지를 추가 된 XmlDocument 조각을 사용하는 방법에 대한 생각했다.

조언을 해주시면 감사하겠습니다.

EDIT Ive가 원본 XML을 읽도록 코드를 변경했지만 파일이 계속 덮어 쓰기됩니다.

+2

'new XmlTextWriter()'를 사용하지 마십시오. .NET 2.0 이후로는 사용되지 않습니다. 대신'XmlWriter.Create()'를 사용하십시오. –

답변

4

전체 파일을로드하고 메모리에서 수정 한 다음 원본 파일을 대체하여 내용을 다시 쓰려면 XmlDocument 클래스를 사용해야합니다. 걱정하지 마세요. 마크 업을 엉망으로 만들지 않으므로 PreserveWhitespace 속성 (http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.preservewhitespace.aspx)을 사용하여 원본 문서의 중요하지 않은 공백을 보존하도록 요청할 수도 있습니다. 당신이 뭔가를 시도 할 수

+3

kicsit이 "XmlDocument"라고 말한 부분을 제외하고는 XDocument와 Linq를 XML에 사용하려는 경우를 제외하고는 상당히 잘하고 작업하기 쉽습니다. 파일에서 문서를 읽고 그와 동등한 저장을 수행하는 정적로드 메소드가 있습니다. – Murph

+0

나는 대부분의 질문에 그들이 사용하는 .NET의 버전을 기술하지 않았다고 생각한다. LINQ는 2.0 또는 이전 버전에는 없습니다. – Nayan

+0

죄송합니다, 사용하여 3.5 – Ryan

1

... 당신은 System.Xml.Linq 네임 스페이스를 추가하는 것을 잊지 사용 해달라고하는 어떤으로 변수를 교체 할 시작할 수 있어야

 string fileLocation = "clients.xml"; 

     if (!File.Exists(fileLocation)) 
     { 
      XmlTextWriter writer = new XmlTextWriter(fileLocation, null); 
      writer.WriteStartElement("Clients"); 
      writer.WriteEndElement(); 
      writer.Close(); 
     } 

     // Load existing clients and add new 
     XElement xml = XElement.Load(fileLocation); 
      xml.Add(new XElement("User", 
      new XAttribute("username", loginName), 
      new XElement("DOB", dob), 
      new XElement("FirstName", firstName), 
      new XElement("LastName", lastName), 
      new XElement("Location", location))); 
     xml.Save(fileLocation); 

.

아직도 문제가 생기면 여기에 다시 게시하여 문제를 해결하는 데 도움이됩니다.

0

직렬화를 사용하려면 (데이터 객체를 XML로 직렬화하고 기존 XML 파일에 추가하려는 경우)이 일반 메소드 SerializeAppend<T>을 사용할 수 있습니다. 그것은 당신이 필요로하는 것을 정확히합니다. 또한 도움이 될만한 사람에게 두 가지 방법을 추가했습니다.

public static void Serialize<T>(T obj, string path) 
{ 
    var writer = new XmlSerializer(typeof(T)); 

    using (var file = new StreamWriter(path)) 
    { 
     writer.Serialize(file, obj); 
    } 
} 


public static T Deserialize<T>(string path) 
{ 
    var reader = new XmlSerializer(typeof(T)); 
    using (var stream = new StreamReader(path)) 
    { 
     return (T)reader.Deserialize(stream); 
    } 

} 

public static void SerializeAppend<T>(T obj, string path) 
{ 
    var writer = new XmlSerializer(typeof(T)); 

    FileStream file = File.Open(path, FileMode.Append, FileAccess.Write); 

    writer.Serialize(file, obj); 

    file.Close(); 
} 
+0

다시 같은 네임 스페이스를 추가합니다 .. 마지막 자식 노드에 추가 할 것이다하지만 그것을 문서 끝에 추가합니다. –