2010-12-07 43 views
0

我在這裏要做的是看看該元素是否存在於xml文檔中,如果存在,那麼我想修改它的內部文本。如果它不存在,我想創建它併爲它創建適當的內部文本。然而,當一個元素確實存在時,我試圖將其內部文本更改爲比整個xml文件寫入更短的東西。XML.Save文件寫神祕

我的代碼:

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

較短的內部文本後:

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

見 「額外」/ 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 2010-12-07 08:04:18

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);   

你應該看到:

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

相反FileMode.Open的,你想FileMode.Create,因此,如果它存在的文件被你寫它之前截斷已經。

0

另一個必須保存XmlDocument的選項是通過使用XmlWriter而不是FileStream。

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); 
     } 
    } 

另外,如果你繼續使用你原來的FileStream方法,那麼我會建議在using語句包裹它就像我與的XmlWriter上面做,如果你這樣做,那麼你就可以擺脫的FS。 Close()語句。