我有一个带有加载,保存,添加和导航按钮的表单,用于处理XML文件。
以下是XML文件的结构和内容:
<?xml version="1.0" encoding="utf-8"?>
<BookList>
<Book>
<Title>Song of myself</Title>
<Author>Walt Whitman</Author>
<isbn>234-0232</isbn>
<Year>1999</Year>
<Editure>Some editure</Editure>
</Book>
<Book>
<Title>Richard III</Title>
<Author>William Shakespeare</Author>
<isbn>234-23432</isbn>
<Year>2001</Year>
<Editure>Some other editure</Editure>
</Book>
</BookList>
这是删除按钮的代码(我遇到了问题):
private void button8_Click(object sender, EventArgs e)
{
XmlNodeList nodes = xmlDoc.SelectNodes("//BookList/Book");
foreach (XmlNode item in nodes)
{
string ISBN = item["isbn"].InnerText;
if (ISBN == textBox3.Text)
{
try
{
item.ParentNode.RemoveChild(item);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
saveFile();
xpatNav = moveToFirstBook(xpatNav);
List<String> values = this.retrieveCurrentValues(xpatNav);
loadTextBoxes(values);
}
表单有一个ISBN文本字段。代码遍历XML节点,如果当前节点的ISBN与表单中的节点的ISBN相同,则删除它(好吧,它应该)。然后保存文件,表单将自己定位在第一个节点(最后三个节点)上。
但是,假设我们将自己定位在最后一本书上 - 当我按下删除按钮时,我得到的只是一个混乱的xml文件,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<BookList>
<Book>
<Title>Song of myself</Title>
<Author>Walt Whitman</Author>
<isbn>234-0232</isbn>
<Year>1999</Year>
<Editure>Some editure</Editure>
</Book>
</BookList>
<Title>Richard III</Title>
<Author>William Shakespeare</Author>
<isbn>234-23432</isbn>
<Year>2001</Year>
<Editure>Some other editure</Editure>
</Book>
</BookList>
我尝试了很多方法来实现它,但我根本就没有得到它。
[编辑] 好的,所以我根据Jens Erat的建议更改了一些代码。删除按钮代码看起来像(虽然稍微改变):
private void button8_Click(object sender, EventArgs e)
{
XmlNodeList node = xmlDoc.SelectNodes("//ListaCarti/Carte[isbn='" + textBox3.Text + "']");
try
{
node.Item(0).ParentNode.RemoveChild(node.Item(0));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
saveFile();
xpatNav = moveToFirstBook(xpatNav);
List<String> values = this.retrieveCurrentValues(xpatNav);
loadTextBoxes(values);
}
以下是保存文件的代码:
private void saveFile()
{
fs = new FileStream(this.openedXml, FileMode.Open, FileAccess.Write, FileShare.Write);
xmlDoc.Save(fs);
fs.Close();
}
其中this.openedXml是打开的XML的路径。
这是加载按钮的代码:
public void loadXml()
{
if (XMLloaded)
{
try
{
fs = new FileStream(this.openedXml, FileMode.Open, FileAccess.Read);
xmlDoc.Load(fs);
fs.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
xpatNav = xmlDoc.CreateNavigator();
XPathNavigator xnav = xpatNav;
countNodes(xnav);
// we load the first value into the form
if (this.nodesNumber > 0) // if the XML it's not empty
{
xnav = moveToFirstBook(xnav
//this retrieve the values for current title, author, isbn, editure
List<string> values = retrieveCurrentValues(xnav);
loadTextBoxes(values);
}
}
}
我认为这看起来有点乱,所以这可能是一个问题。
答案 0 :(得分:1)
更改Save()方法。当前的只是覆盖文件的开头但不删除旧的(较长的)内容。
private void saveFile()
{
//fs = new FileStream(this.openedXml, FileMode.Open, FileAccess.Write, FileShare.Write);
fs = new FileStream(this.openedXml, FileMode.Create);
xmlDoc.Save(fs);
fs.Close();
}