【问题标题】:Adding to XML file添加到 XML 文件
【发布时间】:2012-03-18 19:08:12
【问题描述】:

我正在制作一个 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 个列表框,用于选择 AM 或 PM 的打开和关闭时间。

我假设我使用 XmlTextWriter,但我不知道如何将文本添加到预先存在的 XML 文件中。

【问题讨论】:

    标签: c# xml wpf text


    【解决方案1】:

    最简单的方法不是使用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);
    

    【讨论】:

    • 我写的是一样的,但不可能更快地回答)))我对乔恩的敬意,他只是帮助任何人解决他们的问题,即使问题很简单,而其他人则减去投票。跨度>
    • 非常感谢。这非常简单而且很有帮助!对不起,如果这是一个菜鸟问题!
    【解决方案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);
    

    【讨论】:

    • 你打败了我。这是我的示例:rhyous.com/2010/04/29/… 我推荐 XML 序列化而不是 XDocument。
    • @Rhyous,好文章:开始使用 XmlSerializer 类的简单示例。
    猜你喜欢
    • 2013-08-04
    • 2013-03-10
    • 1970-01-01
    • 2012-02-17
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多