每次执行读取后,再执行新增,然后执行修改,就会报错.
什么原因呢?
  /// <summary>
        /// 新增
        /// </summary>
        private void AddXmlInfo()
        {
            //忽略xml文件注释
            //忽略xml文件注释
            XmlDocument doc = new XmlDocument();
            //XmlReaderSettings xmlSetting = new XmlReaderSettings();
            // xmlSetting.IgnoreComments = true;
            //XmlReader xmlReader = XmlReader.Create(filePath, xmlSetting);
            doc.Load(filePath);
            XmlNode rootNode = doc.SelectSingleNode("LedList");            XmlElement ledElement = doc.CreateElement("Led");
            ledElement.SetAttribute("ScreenIndex", txtNewId.Text);
            XmlElement xWidth = doc.CreateElement("Width");
            xWidth.InnerText = txtWidth.Text;
            XmlElement xHeight = doc.CreateElement("Height");
            xHeight.InnerText = txtHeight.Text;
            XmlElement xIPAddress = doc.CreateElement("IPAddress");
            xIPAddress.InnerText = txtIpAddress.Text;
            XmlElement xIPPort = doc.CreateElement("IPPort");
            xIPPort.InnerText = txtPortNum.Text;
            XmlElement xSms = doc.CreateElement("Sms");
            xSms.SetAttribute("index", "0");
            ledElement.AppendChild(xWidth);
            ledElement.AppendChild(xHeight);
            ledElement.AppendChild(xIPAddress);
            ledElement.AppendChild(xIPPort);
            XmlElement xnX = doc.CreateElement("nX");
            xnX.InnerText = txtSendX.Text;
            XmlElement xnY = doc.CreateElement("nY");
            xnY.InnerText = txtSendY.Text;
            XmlElement xnW = doc.CreateElement("nW");
            xnW.InnerText = txtSendWidth.Text;
            XmlElement xnH = doc.CreateElement("nH");
            xnH.InnerText = txtSendHeight.Text;
            XmlElement xbFile = doc.CreateElement("bFile");
            xbFile.InnerText = "0";
            XmlElement xbDataType = doc.CreateElement("bDataType");
            xbDataType.InnerText = "0";
            XmlElement xchFontName = doc.CreateElement("chFontName");
            xchFontName.InnerText = txtSendFontName.Text;
            XmlElement xnFontNum = doc.CreateElement("nFontNum");
            xnFontNum.InnerText = txtSendFontSize.Text;
            XmlElement xnFontColor = doc.CreateElement("nFontColor");
            xnFontColor.InnerText = cmbSendColor.SelectedIndex.ToString();
            XmlElement xnActionType = doc.CreateElement("nActionType");
            xnActionType.InnerText = (cmbxSendShow.SelectedItem as ComListItem).Value.ToString();
            XmlElement xnActionSpeed = doc.CreateElement("nActionSpeed");
            xnActionSpeed.InnerText = txtSendFontSize.Text;
            XmlElement xnStillTime = doc.CreateElement("nStillTime");
            xnStillTime.InnerText = txtSendStayTime.Text;
            xSms.AppendChild(xnX);
            xSms.AppendChild(xnY);
            xSms.AppendChild(xnW);
            xSms.AppendChild(xnH);
            xSms.AppendChild(xbFile);
            xSms.AppendChild(xbDataType);
            xSms.AppendChild(xchFontName);
            xSms.AppendChild(xnFontNum);
            xSms.AppendChild(xnFontColor);
            xSms.AppendChild(xnActionType);
            xSms.AppendChild(xnActionSpeed);
            xSms.AppendChild(xnStillTime);
            ledElement.AppendChild(xSms);
            rootNode.AppendChild(ledElement);
         //   xmlReader.Close();
            doc.Save(filePath);
           
        }
        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="index"></param>
        private void UpdateXmlInfoByScreenIndex(string sindex)
        {
            //忽略xml文件注释
            XmlDocument doc = new XmlDocument();
            //XmlReaderSettings xmlSetting = new XmlReaderSettings();
            // xmlSetting.IgnoreComments = true;
            //XmlReader xmlReader = XmlReader.Create(filePath, xmlSetting);
            doc.Load(filePath);
            XmlNode rootNode = doc.SelectSingleNode("LedList");
            // StringBuilder sb = new StringBuilder();
            foreach (XmlNode node in rootNode.ChildNodes)
            {
                XmlElement xe = (XmlElement)node;
                string ScreenIndex = xe.GetAttribute("ScreenIndex");
                //屏幕1
                if (ScreenIndex.Equals(sindex))
                {
                    XmlNodeList nodelist = xe.ChildNodes;                    nodelist[0].InnerText = txtWidth.Text;
                    nodelist[1].InnerText = txtHeight.Text;
                    nodelist[2].InnerText = txtIpAddress.Text;
                    nodelist[3].InnerText = txtPortNum.Text;
                    //获取字幕1内容
                    XmlNodeList smsList1 = nodelist[4].ChildNodes;
                    smsList1[0].InnerText = txtSendX.Text;
                    smsList1[1].InnerText = txtSendY.Text;
                    smsList1[2].InnerText = txtSendWidth.Text;
                    smsList1[3].InnerText = txtSendHeight.Text;
                    smsList1[6].InnerText = txtSendFontName.Text;
                    smsList1[7].InnerText = txtSendFontSize.Text;
                    smsList1[8].InnerText = cmbSendColor.SelectedIndex.ToString();                   
                    //移动方式抓取
                    smsList1[9].InnerText = (cmbxSendShow.SelectedItem as ComListItem).Value.ToString();                    smsList1[10].InnerText = txtSendSpeed.Text;
                    smsList1[11].InnerText = txtSendStayTime.Text;
                }
            }
      
            doc.Save(filePath);
            
        }        /// <summary>
        ///  读取
        /// </summary>
        /// <param name="sindex"></param>
        private void LoadXmlInfoByScreenIndex(string sindex)
        {
            //忽略xml文件注释
            XmlDocument doc = new XmlDocument();
            //XmlReaderSettings xmlSetting = new XmlReaderSettings();
           // xmlSetting.IgnoreComments = true;
            //XmlReader xmlReader = XmlReader.Create(filePath, xmlSetting);
            doc.Load(filePath);
          
            XmlNode rootNode = doc.SelectSingleNode("LedList");
            // StringBuilder sb = new StringBuilder();
            foreach (XmlNode node in rootNode.ChildNodes)
            {
                XmlElement xe = (XmlElement)node;
                string ScreenIndex = xe.GetAttribute("ScreenIndex");
                //屏幕1
                if (ScreenIndex.Equals(sindex))
                {
                    XmlNodeList nodelist = xe.ChildNodes;                    txtWidth.Text = nodelist[0].InnerText;
                    txtHeight.Text = nodelist[1].InnerText;
                    txtIpAddress.Text = nodelist[2].InnerText;
                    txtPortNum.Text = nodelist[3].InnerText;
                    //获取字幕1内容
                    XmlNodeList smsList1 = nodelist[4].ChildNodes;
                    txtSendX.Text = smsList1[0].InnerText;
                    txtSendY.Text = smsList1[1].InnerText;
                    txtSendWidth.Text = smsList1[2].InnerText;
                    txtSendHeight.Text = smsList1[3].InnerText;
                    txtSendFontName.Text = smsList1[6].InnerText;
                    txtSendFontSize.Text = smsList1[7].InnerText;
                    cmbSendColor.SelectedIndex = Convert.ToInt32(smsList1[8].InnerText);
                    //移动方式抓取
                    for (int i = 0; i < cmbxSendShow.Items.Count; i++)
                    {
                        if ((cmbxSendShow.Items[i] as ComListItem).Value.ToString() == smsList1[9].InnerText)
                        {
                            cmbxSendShow.SelectedIndex = i;
                        }
                    }
                    txtSendSpeed.Text = smsList1[10].InnerText;
                    txtSendStayTime.Text = smsList1[11].InnerText;
                }
            }

解决方案 »

  1.   

    没有用到多线程??这是why??
    <?xml version="1.0" encoding="utf-8"?>
    <LedList>
      <Led ScreenIndex="1">
        <Width>64</Width>
        <Height>32</Height>
        <IPAddress>192.168.2.34</IPAddress>
        <IPPort>5005</IPPort>
        <Sms index="0">
          <nX>0</nX>
          <nY>0</nY>
          <nW>64</nW>
          <nH>16</nH>
          <bFile>0</bFile>
          <bDataType>0</bDataType>
          <chFontName>宋体</chFontName>
          <nFontNum>12</nFontNum>
          <nFontColor>1</nFontColor>
          <nActionType>3</nActionType>
          <nActionSpeed>12</nActionSpeed>
          <nStillTime>0</nStillTime>
        </Sms>
      </Led>
      <Led ScreenIndex="2">
        <Width>64</Width>
        <Height>32</Height>
        <IPAddress>192.168.2.34</IPAddress>
        <IPPort>5005</IPPort>
        <Sms index="0">
          <nX>0</nX>
          <nY>0</nY>
          <nW>64</nW>
          <nH>16</nH>
          <bFile>0</bFile>
          <bDataType>0</bDataType>
          <chFontName>宋体</chFontName>
          <nFontNum>12</nFontNum>
          <nFontColor>1</nFontColor>
          <nActionType>3</nActionType>
          <nActionSpeed>12</nActionSpeed>
          <nStillTime>0</nStillTime>
        </Sms>
      </Led>
      

  2.   

    xmlDocument没有提供释放方法的
      

  3.   

    你每次读取、增加、更新后把对象doc清空试试,也就是加上
    doc = null;
      

  4.   

    找到了.
    法克
        /// <summary>
            /// 绑定屏幕总数及序号
            /// </summary>
            private void BindDDlScreenIndex()
            {            string filePath = Process.GetCurrentProcess().MainModule.FileName;
                filePath = filePath.Substring(0, filePath.LastIndexOf("\\") + 1) + "LedConfig.xml";
                cmbScreen.Items.Clear();
                XmlReaderSettings setting = new XmlReaderSettings();
                setting.IgnoreComments = true;
                XmlReader xReader = XmlReader.Create(filePath, setting);
                XmlDocument doc = new XmlDocument();
                doc.Load(xReader);
                XmlNode ledNodes = doc.SelectSingleNode("LedList");
                foreach (XmlNode node in ledNodes)
                {
                    string screenIndex = (node as XmlElement).GetAttribute("ScreenIndex");
                    cmbScreen.Items.Add(new ComListItem(screenIndex, "屏幕" + screenIndex));
                }
                xReader.Close();
            }这边reader忘记close了!!!
      

  5.   

    下面列出微软.net类库提供的读写xml文件个类及其特点:
    类名称 优点 缺点 
    XmlReader 快速、高效、可扩展 只读,只向前,需要人工验证 
    XmlDocument 可往返、可读写、支持XPath筛选 比XmlReader慢 
    XPathNavigator 可往返,支持XPath和XSLT 只读 
    XPathDocument 比XmlDocument,优化支持XPath和XSLT 比XmlReader慢 
    本文提到的XmlReader也是微软类库中的一个类,它的特点是快速高效,并且可扩展,缺点是只读。