Я пишу классы, которые (де) сериализуют в/из XML. При сериализации и десериализации класс получает XPathNavigator для получения данных из/добавления данных.Добавление и управление несколькими дочерними узлами с использованием XPathNavigator в C#
Поскольку класс может содержать объекты, которые должны быть сериализовать тоже (используя тот же механизм), я следующий, чтобы добавить дочерний элемент для каждого объекта:
public void Serialize(XPathNavigator navigator)
{
foreach(IXmlSerializableObject o in objects) {
// Create child element.
navigator.AppendChildElement(string.Empty, "child", string.Empty, null);
// Move to last child element.
navigator.MoveToChild(XPathNodeType.Element);
while (navigator.MoveToNext(XPathNodeType.Element)) ;
// Serialize the object at the current node.
// This will add attributes and child elements as required.
// The navigator will be positiononed at the same node after the call.
o.Serialize(navigator);
navigator.MoveToParent();
}
}
в особенности MoveToParent/Переместить Последняя часть ребенка кажется ужасно неправильной (хотя она работает). Есть лучший способ сделать это?
Другой подход я использую (чтобы избежать этого объекты получить доступ к информации, хранящейся до сих пор) заключается в следующем:
foreach(IXmlSerializableObject o in objects) {
{
// Create a new (empty) document for object serialization.
XPathNavigator instructionNavigator = new XmlDocument().CreateNavigator();
instructionNavigator.AppendChildElement(string.Empty, "child", string.Empty, null);
instructionNavigator.MoveToChild(XPathNodeType.Element);
// Serialize the object.
o.Serialize(instructionNavigator);
// Now add the serialized content to the navigator.
instructionNavigator.MoveToRoot();
instructionNavigator.MoveToChild(XPathNodeType.Element);
navigator.AppendChild(instructionNavigator);
}
Оба подхода кажутся каким-то образом косвенными, поскольку они оба создают много накладных расходов. Я бы предложил любые идеи или подсказки о том, как улучшить свой алгоритм.
поздравления, Dominik
Есть ли у вас какие-либо причины использовать XPathNavigator? Это не кажется особенно естественным. Я бы использовал 'XmlWriter' или LINQ to XML. –
Поскольку я начал с XPathNavigator для десериализации и хотел, чтобы реализация использовала как можно меньше классов. Хотя XmlWriter отлично подходит для моих целей ... – Korexio