Добавить новое в xml-файл каждый раз, когда на странице появляется новый контент [duplicate]

Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:

object o = null;
DateTime d = (DateTime)o;

Он выкинет NullReferenceException в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.

Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:

" />

Здесь SelectedDate на самом деле является свойством - типа DateTime - типа Calendar Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...

1
задан Wonko the Sane 6 October 2010 в 18:14
поделиться

4 ответа

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

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

Вот пример создания того же XML, что и у вас (кроме объявления: любая причина вы хотели бы хотеть использовать Latin-1 вместо чего-то вроде UTF-8, который может представлять весь Unicode, btw?)

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")));

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

5
ответ дан Jon Skeet 31 August 2018 в 12:59
поделиться

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

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

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

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

0
ответ дан Babak Naffas 31 August 2018 в 12:59
поделиться

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

    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; }
}
0
ответ дан Martin Törnwall 31 August 2018 в 12:59
поделиться

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

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

Вы (можете) захотеть:

  1. Создайте соответствующие классы для частей, у которых есть члены, которые вы хотите
  2. Создайте коллекцию этих элементов
  3. Обновите сборку в памяти из вашего пользовательского интерфейса
  4. g2]
  5. Сохраните коллекцию с использованием форматирования и функциональности XML по вашему выбору (включая, помимо прочего, то, что вы делаете выше, или LINQ to XML или XML Serialization или ...)
0
ответ дан Wonko the Sane 31 August 2018 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: