0

我正在尝试更新 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;
     }
}
4

1 回答 1

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); 
}
于 2012-12-11T17:07:28.440 回答