每次执行读取后,再执行新增,然后执行修改,就会报错.
什么原因呢?
/// <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;
}
}
什么原因呢?
/// <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;
}
}
<?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>
doc = null;
法克
/// <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了!!!
类名称 优点 缺点
XmlReader 快速、高效、可扩展 只读,只向前,需要人工验证
XmlDocument 可往返、可读写、支持XPath筛选 比XmlReader慢
XPathNavigator 可往返,支持XPath和XSLT 只读
XPathDocument 比XmlDocument,优化支持XPath和XSLT 比XmlReader慢
本文提到的XmlReader也是微软类库中的一个类,它的特点是快速高效,并且可扩展,缺点是只读。