2012-03-18 3 views
0

나는 식당 정보를 추출하는 XML 파일을 통해 검색하는 WPF를 만들고 있습니다. 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 개의 목록 상자가 있습니다.

내가 XmlTextWriter를 사용한다고 가정하지만 기존 XML 파일에 텍스트를 추가하는 방법을 알 수 없습니다.

답변

9

가장 간단한 방법은 XmlTextWriter을 사용하지 않는 것입니다. 전체를 메모리 내에서로드하고 새 요소를 추가 한 다음 저장하면됩니다. 분명히 대용량 파일에는 대단히 효율적은 아니지만, 그 파일에서 벗어날 수 있다면 정말 간단합니다. 더

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를 사용 XmlSerializer 클래스의 인스턴스가이를 달성 할 수 있습니다

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

내가 같은를 작성했지만,이 문제는 경우에도,))) 빠른 단지 그들의 문제를 해결하기 위해 사람을 도와 존 내 존경을, 대답하는 것은 불가능하다 간단하게, 다른 것은 투표를 뺀다. –

+0

정말 고마워요. 이것은 매우 쉽고 유용했습니다! 그것이 멍청한 질문 이었다면 미안 해요! –

2

.

[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/ XDocument를 통한 XML 직렬화 권장. – Rhyous

+0

@Rhyous, 좋은 기사 :'XmlSerializer' 클래스로 시작하는 간단한 예제. –