在C#中使用XPathNavigator添加和操作多个子节点

时间:2010-10-15 06:25:24

标签: c# xml xpathnavigator

我正在编写(de)序列化到XML或从XML序列化的类。在序列化和反序列化时,该类获取XPathNavigator以从/向其添加数据。

因为类可能包含需要序列化的对象(使用相同的机制),所以我执行以下操作为每个对象添加子元素:

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 / Move to last child part似乎非常错误(虽然它有效)。有更好的方法吗?

我使用的另一种方法(避免对象访问到目前为止存储的信息)是这样的:

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

这两种方法似乎都具有某种程度的间接性,因为它们都会产生很多开销。我会评论如何改进我的算法的任何想法或提示。

问候, 多米尼克

1 个答案:

答案 0 :(得分:0)

正如Jon Skeet在评论中所说,我现在使用XmlReader和XmlWriter而不是XPathNavigator。这似乎更清洁;

public void Serialize(XmlWriter writer)
{

    foreach (Instruction task in this.Tasks)
    {
        writer.WriteStartElement(task.Tag);

        task.Serialize(writer);

        writer.WriteEndElement();
    }
}

谢谢!