2010-12-07 5 views
0

내가 여기에서하려고하는 것은 XML 문서에 요소가 있는지 여부를 확인하는 것입니다. 존재하는 경우 요소의 내부 텍스트를 수정하려고합니다. 그것이 존재하지 않는다면 나는 그것을 만들고 그것을위한 적절한 내부 텍스트를 만들고 싶다. 그러나 요소가 존재할 때 내부 텍스트를 변경하려고하면 XML 파일 전체가 변경된 것보다 짧아집니다.XML.Save 파일 작성 신비

내 코드 :

<?xml version="1.0" encoding="utf-8"?> 
<MyXMLFile> 
    <Source>C:\Users\Dacto\Desktop\Napster</Source> 
    <Destination>C:\Users</Destination> 
</MyXMLFile>/MyXMLFile> 

는 "추가"/ MyXMLFile 참조 : 짧은 내부 텍스트 후

<?xml version="1.0" encoding="utf-8"?> 
<MyXMLFile> 
    <Source>C:\Users\Dacto\Desktop\</Source> 
    <Destination>C:\Program Files\Adobe</Destination> 
</MyXMLFile> 

: 짧은 내부 텍스트를 수정하기 전에

   XmlDocument xmldoc = new XmlDocument(); 
       xmldoc.Load(path); 
       XmlNodeList felement = xmldoc.GetElementsByTagName(Element); 
       FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 
       if (felement.Count == 0) 
       { 
        XmlElement elmRoot = xmldoc.DocumentElement; 
        XmlElement xmlele = xmldoc.CreateElement(Element); 
        xmlele.AppendChild(xmldoc.CreateTextNode(data)); 
        elmRoot.AppendChild(xmlele); 
        xmldoc.Save(fs); 
       } 
       else 
       { 
        felement[0].InnerText = data; 
        xmldoc.Save(fs); 
       } 
       fs.Close(); 

XML 파일 > 무슨 일이야 ??

답변

2

출력이 유효한 XML이 아니기 때문에 XmlDocument.Save가 파일의 전체 내용을 생성했을 가능성은 거의 없습니다. 이 점을 감안할 때 FileStream을 만들 때 FileMode.Open 대신 다른 매개 변수를 제공해야한다고 생각합니다. FileMode.Create는 파일을 쓰기 전에 잘 렸는지 확인합니다. 현재 덮어 쓰여지고 있습니다. 예전의 내용은 그대로 둡니다. 새로운 파일이 그것을 감당할만큼 크지 않은 경우.

+0

그게 무슨 일이 일어나고 있는지, 나는 그것을 FileMode.Truncate로 바꿨다. 그리고 그것은 작동한다 : – Dacto

+1

다행이다. 파일이 존재하지 않을 가능성이있는 경우 FileMode.Create가 가장 좋은 방법입니다. 이미 존재하는지 여부에 따라 파일을 만들거나자를 것이므로 가장 좋습니다. –

+0

이전에 일부 코드에서 경로가 실제로 존재하는지 확인하고 그렇지 않은 경우 경로를 만듭니다. – Dacto

0

문제는 XML을 사용하지 않고 파일을 쓰는 것입니다. 당신이 뭔가를하려고하면

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite); 
byte[] info = new UTF8Encoding(true).GetBytes("AAAAA"); 
fs.Write(info, 0, info.Length);   

당신은 볼 수 : 당신이 그것을 기록하기 전에 존재하는 경우 파일이 잘립니다 있도록 대신 FileMode.Open의

AAAAA version="1.0" encoding="utf-8"?> 
<MyXMLFile> 
    <Source>C:\Users\Dacto\Desktop\</Source> 
    <Destination>C:\Program Files\Adobe</Destination> 
</MyXMLFile> 

을, 당신은 FileMode.Create을 원하는 이미.

0

XmlDocument를 저장해야하는 또 다른 옵션은 FileStream 대신 XmlWriter를 사용하는 것입니다. 당신이 당신의 원본 파일 스트림 방법을 계속하는 경우

XmlDocument xmldoc = new XmlDocument(); 
    xmldoc.Load(path); 
    XmlNodeList felement = xmldoc.GetElementsByTagName(Element); 

    XmlWriterSettings settings = new XmlWriterSettings(); 
    settings.Indent = true; 

    using (XmlWriter wr = XmlWriter.Create(path), settings)) 
    { 
     if (felement.Count == 0) 
     { 
      XmlElement elmRoot = xmldoc.DocumentElement; 
      XmlElement xmlele = xmldoc.CreateElement(Element); 
      xmlele.AppendChild(xmldoc.CreateTextNode(data)); 
      elmRoot.AppendChild(xmlele); 
      xmldoc.Save(wr); 
     } 
     else 
     { 
      felement[0].InnerText = data; 
      xmldoc.Save(wr); 
     } 
    } 

또한, 나는 내가 XmlWriter를 위에서 수행하고 당신이 할 경우, 당신은 FS 제거 할 수처럼 사용하여 문에 포장 추천 할 것입니다. Close() 문.