2016-11-23 11 views
0

私は小さなXMLエディターを作ろうとしています。 XMLファイルを読み込み、すべての書籍のタイトル(私のサンプルファイル内)をリストボックスに表示します。タイトルをクリックすると、テキストボックスにブックに関するすべての情報が表示されます。情報を変更する必要がある場合は、ユーザーが[編集]ボタンをクリックすると、情報を新しいテキストボックスで編集できるようになります。最後に、変更が保存され、両方のテキストボックスがクリアされます。可能であれば、新しく更新されたXMLファイルのタイトルをリストボックスに再ロードする必要があります(screenshot)。Linqを使って要素をXMLファイルに編集して保存します

this postのおかげで、リストボックスと最初のテキストボックス操作が正常に動作します。 2番目のテキストボックスにXML値を送信しようとすると、問題が発生します。変更は保存されません。変更が保存されている場合、残りのXMLファイルは消えます。

解決策は、情報(およびその変更)を新しいXML要素に追加して古いものを削除することで解決できると思いますが、これまでのところ、私はしばらく試していました。どのようにそれを行うかを把握していない。同じ理由で、悪いスタイルだと分かっていますが、問題が始まるところでコードが短くなります。誰かが私を助けることができたら嬉しいです。

私の例のXML:

<?xml version='1.0'?> 
<!-- This file represents a fragment of a book store inventory database --> 
<books> 
    <book genre="autobiography"> 
    <title>The Autobiography of Benjamin Franklin</title> 
    <author>Franklin, Benjamin</author> 
    <year>1981</year> 
    <price>8.99</price> 
    </book> 
    <book genre="novel"> 
    <title>The Confidence Man</title> 
    <author>Melville, Herman</author> 
    <year>1967</year> 
    <price>11.99</price> 
    </book> 
    <book genre="philosophy"> 
    <title>The Gorgias</title> 
    <author>Plato</author> 
    <year>1991</year> 
    <price>9.99</price> 
    </book> 
</books> 

そして、私は.cs

private void btnLoadXML_Click(object sender, EventArgs e) 
    { 
     var xmlDoc = XDocument.Load("books03.xml"); 

     var elements = from ele in xmlDoc.Elements("books").Elements("book") 
         where ele != null 
         select ele; 

     bookList = elements.ToList(); 

     foreach (var book in bookList) 
     { 
      string title = book.Element("title").Value; 
      listBox1.Items.Add(title); 
     } 
    } 

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     var book = bookList[listBox1.SelectedIndex]; 

     textBox1.Text = 
      "Title: " + book.Element("title").Value + Environment.NewLine + 
      "Author: " + book.Element("author").Value + Environment.NewLine + 
      "Year: " + book.Element("year").Value + Environment.NewLine + 
      "Price: " + book.Element("price").Value; 
    } 

    private void btnEdit_Click(object sender, EventArgs e) 
    { 
     textBox2.Visible = true; 
     btnSaveClose.Visible = true; 
    } 
} 

答えて

0

は、XML LINQをお試しください:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      string searchName = "The Autobiography of Benjamin Franklin"; 
      XElement book = doc.Descendants("book").Where(x => (string)x.Element("title") == searchName).FirstOrDefault(); 

      XElement price = book.Element("price"); 

      price.SetValue("10.00"); 
     } 
    } 
} 
+0

しかし、どのように私は私のコードでそれを実装するのですか?それをいくつかの方法で 'btn_edit()'の下に追加しますか? – Cunctator03

関連する問題