C # Добавление данных в XML-файл - PullRequest
1 голос
/ 06 октября 2010

Я создаю приложение Parts для изучения C # и WPF. У меня возникли проблемы с добавлением новых частей с помощью XmlWriter. Я могу создать файл XML, но не могу понять, как добавить дополнительные части. Должен ли я использовать что-то еще, как XmlDocument? Вот мой код:

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>

Ответы [ 4 ]

5 голосов
/ 06 октября 2010

Лично я бы предложил использовать LINQ to XML.Это намного API проще в использовании, чем XmlDocument.

Но да, если вы хотите изменить существующий документ, тогда обычно с использованием представления в памятипроще, чем использование потокового API. возможно , конечно, сделать последнее, но это нелегко.

Вот пример для создания того же XML, который вы уже получили (кроме объявления: любая причина, по которой вы 'd хотите использовать 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 голосов
/ 06 октября 2010

Рассматривали ли вы использовать готовую сериализацию XML, которая поставляется с .NET?Вы просто заполняете свои объекты в некоторой коллекции, а затем используете XML Serializer для сохранения в файл.Затем вы можете использовать DeSerializer для увлажнения ваших объектов.

Это позволит вам тратить больше времени на пользовательский интерфейс вашего приложения и логику.Все, что вам нужно сделать, это все атрибут Serializable для вашего класса.

Вот хороший пример: http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

Самое большое преимущество состоит в том, что при построении объекта данных со временем сериализация/ десериализация будет расти вместе с ним.

0 голосов
/ 06 октября 2010

Приведенный выше код делает именно то, на что он похож: пишет элемент «MyParts», а затем записывает дочерний элемент «parts», а затем дочерний элемент «item» со значением того, что находится в вашем текстовом поле.

Это пахнет подозрительно, как домашняя работа, и легко поддается Google, так что я только собираюсь дать быстрый псевдо-ответ.

Вы (возможно) хотите:

  1. Создайте соответствующий класс (ы) для деталей, в которых есть требуемые элементы
  2. Создать коллекцию этих предметов
  3. Обновите эту коллекцию в памяти из вашего пользовательского интерфейса
  4. Сохраните коллекцию, используя форматирование XML и функциональность по вашему выбору (включая, помимо прочего, то, что вы делаете выше, или LINQ to XML, или сериализацию XML, или ...)
0 голосов
/ 06 октября 2010

Используйте цикл, и вы получите что-то вроде:

    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"?) и все его содержимое, заполняя item, color и size данными из класса Part, который в простейшей форме может быть:

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