2012-03-18 125 views
0

我正在製作一個WPF,用於搜索抽出餐館信息的XML文件。 XML格式如下:添加到XML文件

<FoodPhoneNumbers> 
     <Restaurant Name="Pizza Place"> 
     <Type>Pizza</Type> 
     <PhoneNumber>(123)-456-7890</PhoneNumber> 
     <Hours> 
      <Open>11:00am</Open> 
      <Close>11:00pm</Close> 
     </Hours> 
     </Restaurant> 
    </FoodPhoneNumbers> 

我希望能夠將新的餐廳添加到XML文件中。我有一個餐廳名稱和類型的文本框。然後三個電話號碼的文本框。 4個組合框的開放時間,開放分鐘,結束時間和結束分鐘。我也有2個列表框供選擇AM或PM作爲開啓和關閉時間。

我假設我使用XmlTextWriter,但我無法弄清楚如何將文本添加到預先存在的XML文件。

回答

9

最簡單的方法是不要使用XmlTextWriter - 只是將整個內容加載到內存表示中,添加新元素,然後保存。顯然這對於​​大文件來說並不是非常有效,但如果你可以避開它,這非常簡單。例如,使用XDocument

XDocument doc = XDocument.Load("test.xml"); 
XElement restaurant = new XElement("Restaurant", 
    new XAttribute("Name", "Frenchies"), 
    new XElement("Type", "French"), 
    new XElement("PhoneNumber", "555-12345678"), 
    new XElement("Hours", 
     new XElement("Open", "1:00pm"), 
     new XElement("Close", "2:00pm"))); 
doc.Root.Add(restaurant); 
doc.Save("test.xml"); 

或者,更好:

XDocument doc = XDocument.Load("test.xml"); 
Restaurant restaurant = ...; // Populate a Restaurant object 

// The Restaurant class could know how to serialize itself to an XElement 
XElement element = restaurant.ToXElement(); 

doc.Root.Add(element); 
+0

我寫的一樣,但它不可能回答更快)))我對喬恩的尊重,誰只是幫助別人解決他們的問題,即使問題是簡單,而其他人則減去投票。 – 2012-03-18 19:22:47

+0

非常感謝。這非常簡單和有幫助!對不起,如果這是一個noob問題! – 2012-03-18 19:45:51

2

XmlSerializer類的實例可以用來實現這一目標。

[XmlRoot("FoodPhoneNumbers")] 
public class FoodPhoneNumbers 
{ 
    [XmlElement(ElementName = "Restaurant")] 
    public List<Restaurant> Restaurants { get; set; } 
} 

public class Restaurant 
{ 
    [XmlAttribute] 
    public string Name { get; set; } 

    [XmlElement] 
    public string Type { get; set; } 

    [XmlElement] 
    public string PhoneNumber { get; set; } 

    [XmlElement(ElementName = "Hours")] 
    public List<Hours> Hours { get; set; } 
} 

public class Hours 
{ 
    [XmlElement] 
    public string Open { get; set; } 

    [XmlElement] 
    public string Close { get; set; } 
} 

序列化/反序列化代碼:

// Deserialize. 
FoodPhoneNumbers food; 
using (Stream inputStream = File.OpenRead(inputFilePath)) 
    food = (FoodPhoneNumbers) xmlSerializer.Deserialize(inputStream); 

// Add a new one. 
Restaurant restaurant = new Restaurant 
    { 
     Name = "Coffee restraurant", 
     PhoneNumber = "0xFF", 
     Type = "Coffee shop" 
    }; 
food.Restaurants.Add(restaurant); 

// Serialize. 
using (Stream outputStream = File.OpenWrite(outputFilePath)) 
    xmlSerializer.Serialize(outputStream, food); 
+1

你打敗了我。這裏是我的例子: http://www.rhyous.com/2010/04/29/generic-xml-serializer-class-for-c-and-an-xml-serialization-usage-example/ I建議通過XDocument進行XML序列化。 – Rhyous 2012-03-18 19:45:06

+0

@Rhyous,好文章:開始使用'XmlSerializer'類的簡單例子。 – 2012-03-18 19:48:23