2010-10-06 161 views
1

我正在構建一個零件應用程序,以便學習C#和WPF。我嘗試使用XmlWriter添加新零件時遇到問題。我可以創建xml文件,但不能確定如何添加其他部分。我應該使用其他類似XmlDocument的東西嗎?這裏是我的代碼背後:C#將數據添加到xml文件

private void btnSave_Click(object sender, RoutedEventArgs e) 
    { 

     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Encoding = Encoding.UTF8; 
     settings.Indent = true; 

     using (XmlWriter writer = XmlWriter.Create("f:\\MyParts.xml", settings)) 
     { 
      writer.WriteStartDocument(); 
      writer.WriteStartElement("MyParts"); 
      writer.WriteStartElement("parts"); 
      writer.WriteStartElement("item"); 
      writer.WriteString(txtbxitem.Text); 
      writer.WriteEndElement(); 

      writer.WriteStartElement("color"); 
      writer.WriteString(txtbxcolor.Text); 
      writer.WriteEndElement(); 

      writer.WriteStartElement("size"); 
      writer.WriteString(txtbxsize.Text); 
      writer.WriteEndElement(); 

      writer.WriteEndElement(); 
      writer.WriteEndDocument(); 

      writer.Flush(); 
      writer.Close(); 

     } 
    } 

此代碼正確創建XML文件和節點,但如何添加其他部分?這是我想創建的:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

<MyParts> 
    <parts> 
    <item>Part1</item> 
    <color>Red</color> 
    <size>SM</size> 
    </parts> 
    <parts> 
    <item>Part2</item> 
    <color>Blue</color> 
    <size>XXL</size> 
    </parts> 
</MyParts> 

回答

5

我個人建議使用LINQ to XML。這是一個很多更容易使用的API比XmlDocument

但是,如果您想要修改現有文檔,那麼通常使用使用內存中表示比使用流式API更簡單。這是可能當然做後者,但這並不容易。

這裏有一個例子來創建你已經得到的相同的XML(除了聲明:你想要想要使用Latin-1而不是像UTF-8這樣的東西可以代表整個Unicode的,順便說一句)

var doc = new XDocument(
    new XElement("MyParts", 
    new XElement("parts", 
     new XElement("item", "Part1"), 
     new XElement("color", "Red"), 
     new XElement("size", "SM")), 
    new XElement("parts", 
     new XElement("item", "Part2"), 
     new XElement("color", "Blue"), 
     new XElement("size", "XXL")))); 

然後,如果你想添加另一部分:

doc.Root.Add(
    new XElement("parts", 
    new XElement("item", "Part3"), 
    new XElement("color", "Green"), 
    new XElement("size", "L"))); 

誠然,我期望你要封裝的「創建部分元素」位爲方法以避免一直重複......但希望你可以得到照片。

+0

你會說LINQ to XML是用c#創建和編輯xml文件的最佳方式嗎?我想明智地花費我的學習時間。 – 2010-10-06 17:26:11

+0

@Lone:假設您可以使用.NET 3.5或更高版本,這是* most *問題的最佳解決方案。如果你正在處理一個巨大的文件,'XmlReader'可能會很有用,但我至少會*啓動LINQ to XML。 – 2010-10-06 17:35:59

+0

我同意@Jon:越容易越好!在這裏,我正在處理一個簡單的Xml文檔,並且XDocument非常好,並且易於構建我的內容(您看到的是您所得到的內容) – 2010-10-11 12:35:29

0

使用一個循環,你會喜歡的東西最終會:

var parts = new List<Part>() { ...... parts here ...... };   

    using (XmlWriter writer = XmlWriter.Create("f:\\MyParts.xml", settings)) 
    { 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("MyParts"); 

     foreach(var part in parts) 
     { 
      writer.WriteStartElement("parts"); 
      writer.WriteStartElement("item"); 
      writer.WriteString(part.Item); 
      writer.WriteEndElement(); // </item> 

      writer.WriteStartElement("color"); 
      writer.WriteString(part.Color); 
      writer.WriteEndElement(); 

      writer.WriteStartElement("size"); 
      writer.WriteString(part.Size); 
      writer.WriteEndElement(); // </size> 

      writer.WriteEndElement(); // </parts> 
     } 
     writer.WriteEndElement(); // </MyParts> 
     writer.WriteEndDocument(); 

     writer.Flush(); 
     writer.Close(); 

    } 

總的想法是,在你的零件列表中的每個部分,你寫的「零件」(應爲「 ?部分「)標籤的所有內容,從Part類,填充itemcolorsize與數據,以最簡單的形式可能是:

class Part 
{ 
    public string Item { get; set; } 
    public Color Color { get; set; } 
    public string Size { get; set; } 
} 
+0

我收到錯誤,但仍會繼續嘗試。 – 2010-10-06 17:35:20

+0

什麼錯誤,具體是? – 2010-10-06 18:59:48

0

上面的代碼不正是它的樣子:寫一個元素「MyParts」,然後寫一個子元素「parts」,然後寫一個子元素「item」,其值爲任何文本框中的值。

這樣的味道很可疑,就像做家庭作業一樣,並且很容易被谷歌使用,所以我只會給出一個快速的僞回答。

你(可能)要:

  1. 爲要
  2. 創建這些項目
  3. 更新的集合,有成員部分適當類(ES),在內存中的集合從您的用戶界面
  4. 使用您選擇的XML格式和功能保存集合(包括但不限於您上面正在做什麼,或者LINQ to XML或XML Serialization,或...)
+0

我認爲編輯一個xml文件會很容易。我已經搜索了幾天,這可能最能說明我的技能水平。我甚至不知道從哪裏開始,但最終到了xmlwriter工作(如你所知),但後來我指向XmlDocument。我試過的所有東西總是覆蓋,但不會追加。在我的搜索過程中,我確實看到了LINQ to XML,所以知道我要去搜索它。我還會檢查XML序列化。 – 2010-10-06 18:49:04

0

您是否考慮過使用開箱即用的XML序列化?您只需在某個集合中填充對象,然後使用XML序列化器將其保存到文件中。然後你可以使用DeSerializer來保溼你的物體。

這將允許您在應用程序的UI(WPF)和邏輯上花費更多時間。所有你需要做的就是你的類的所有Seri​​alizable屬性。

這裏有一個很好的例子:http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

最大的好處是,當你建立你的數據對象隨着時間的推移,序列化/反序列化將隨之增長。