0

我有一个带有加载、保存、添加和导航按钮的表单,用于操作 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);
                }
            }
        }

我认为这看起来有点混乱,所以这可能是一个问题。

4

1 回答 1

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();
    }
于 2013-07-01T10:38:52.063 回答