2012-12-11 57 views
0

我試圖更新xml的屬性。我的問題是,當我更新,後來我讀了我的XML我有一個例外。我一直在尋找這個問題,我不知道如何,但在XML結束時出現我的一般關閉標記的最後一個字符。有時三個或兩個字符最後或只有字符>。這個問題不會總是發生。有時在第二次,其他人在第四次,其他在第十次...我把一個片段吼叫。非常感謝,併爲我的英語感到難過。XML更新屬性:在末尾添加字符並失敗

PD:我不使用Linq

我的XML

// At the end of xml file appears this fragment 
<?xml version="1.0"?> 
<MYPRINCIPALTAG> 
    <TAG DATE="01/01/01"></TAG> 
</MYPRINCIPALTAG>AG> 

更多代碼;-)

// Read XML 
System.IO.FileStream fs = new System.IO.FileStream (path, System.IO.FileMode.Open, System.IO.FileAccess.Read); 
XmlTextReader reader = new XmlTextReader (fs); 
while (reader.Read()) { 
switch (reader.NodeType) { 
    case XmlNodeType.Element: 
     switch (reader.Name) { 
     case 'TAG': 
      string pubdate = reader.GetAttribute (0); 
      break; 
     } 
     break; 
    } 
fs.Close(); 

public static XmlNode OpenXmlNode(string path, ref System.IO.FileStream fs, ref XmlDocument doc) { 
    fs = new System.IO.FileStream (path, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite); 
    doc = new XmlDocument(); 
    doc.Load (fs); 
    fs.Flush(); 
    fs.Close(); 
    return doc.DocumentElement; 
} 

public static void CloseXmlNode(string path, ref System.IO.FileStream fs, ref XmlDocument doc) { 
    fs = new System.IO.FileStream (path, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite); 
    doc.Save (fs); 
    fs.Flush(); 
    fs.Close(); 
} 

public static Boolean UpdateXML(string path, string id_tag) { 
    try { 
     System.IO.FileStream fs = null; 
     XmlDocument doc = new XmlDocument(); 
     XmlNode element = OpenXmlNode (path, ref fs, ref doc); 
     // Change Date 
     element.ChildNodes[0].Attributes.GetNamedItem ("date").Value = DateTime.Now.ToString ("dd/MM/yy"); 
     for (int count = 1; count < doc.DocumentElement.ChildNodes.Count; count++) { 
      if ((doc.DocumentElement.ChildNodes[count].Attributes.GetNamedItem ("ID").Value).Equals (id_tag)) { 
       for (int i = 0; i < doc.DocumentElement.ChildNodes[count].ChildNodes[0].ChildNodes.Count; i++) { 
       doc.DocumentElement.ChildNodes[count].ChildNodes[0].ChildNodes[i].Attributes.GetNamedItem ("STATE").Value = "ok"; 
       } 
       break; 
      } 
     } 
     CloseXmlNode (path, ref fs, ref doc); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 
} 
+1

在編輯之前,文件的外觀如何? 也讓我們看看你的完整代碼 –

+0

我有很多代碼。 ;-)最後,我把更新XML的方法。在另一種方法中,我讀取了xml,但我使用了微軟提供的代碼。出於這個原因,我不把這個代碼。我的XML之前爲:<?XML版本= 「1.0」>

回答

1

嘗試做一個fs.flush();在fs.Close()之前; 像這樣

doc.Save(fs); 
fs.Flush(); 
fs.Close(); 

更好。你寫代碼的方式(使用靜態函數),你似乎沒有從使用文件流(IMO)中受益。我會更改函數OpenXmlNode()和CloseXmlNode(),如下所示:

public static XmlNode OpenXmlNode(string path, ref XmlDocument doc) 
{ 
    doc = new XmlDocument(); 
    doc.Load (path); 
    return doc.DocumentElement; 
} 
public static void CloseXmlNode(string path, ref XmlDocument doc) 
{ 
    doc.Save (path); 
} 
+0

感謝您的幫助,但不起作用。如果有這個問題,我正在考慮操縱文件。也就是說,打開文件,去我的文檔的最後一行,刪除那些令我不安的字符。 ;-) 你怎麼看? –

+0

我不這麼認爲,這可能是更好的主意。如果你正在初始化一些不同的值,它可能會再次發生。 我們需要更多關於你的代碼的細節。它實際上是簡單的東西 –

+0

嗨,感謝您的幫助。我在上面放了更多的代碼。目前,我把代碼放在Read Method中,因爲我需要這項工作,你知道的。這是我的假代碼;-),這個工程! :'string [] lines = System.IO.File.ReadAllLines(path); (line.Length - 1] .Equals(「」)){0121} System.IO.File.WriteAllLines(path,lines); } System.IO.FileStream fs = new System.IO.FileStream(path,System.IO.FileMode.Open,System.IO.FileAccess.Read); ...' –