Другим сценарием является то, что вы нанесли нулевой объект в тип значения . Например, код ниже:
object o = null;
DateTime d = (DateTime)o;
Он выкинет NullReferenceException
в роли. В приведенном выше примере это кажется совершенно очевидным, но это может произойти в более «поздних связующих» сложных сценариях, где нулевой объект был возвращен из некоторого кода, которого вы не являетесь, и приведение, например, генерируется некоторой автоматической системой.
Одним из примеров этого является этот простой фрагмент привязки ASP.NET с элементом управления календарем:
" />
Здесь SelectedDate
на самом деле является свойством - типа DateTime
- типа Calendar
Web Control, и привязка может отлично вернуть что-то null. Неявный генератор ASP.NET создаст кусок кода, который будет эквивалентен приведенному выше методу. И это поднимет NullReferenceException
, что довольно сложно определить, потому что он лежит в сгенерированном ASP.NET коде, который компилирует отлично ...
Лично я бы предложил использовать 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")));
По общему признанию, я бы предположил, что вы хотите инкапсулировать бит «создать элемент детали» в метод, чтобы не повторять его все время ... но, надеюсь, вы получите фотография.
Считаете ли вы использование XML-сериализации XML, которая поставляется с .NET? Вы просто заполняете свои объекты в какой-либо коллекции, а затем используете XML-сериализатор для сохранения файла. Затем вы можете использовать DeSerializer для гидратации ваших объектов.
Это позволит вам тратить больше времени на пользовательский интерфейс вашего приложения (WPF) и логику. Все, что вам нужно сделать, это весь атрибут Serializable для вашего класса.
Вот хороший пример: http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm
Самое большое преимущество заключается в том, что при создании объекта данных с течением времени сериализация / де-сериализация будет расти вместе с ним.
Используйте цикл, и вы получите что-то вроде:
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; }
}
Вышеприведенный код делает именно то, что он выглядит: пишет элемент «MyParts», а затем записывает дочерний элемент «parts», а затем дочерний элемент «item» со значением, которое находится в вашем текстовом поле.
Это пахнет подозрительно, как домашнее задание, и легко работает с Google, поэтому я собираюсь дать быстрый псевдоответ.
Вы (можете) захотеть: