C# 将克隆的节点追加到同一xml文档

C# 将克隆的节点追加到同一xml文档,c#,xml,C#,Xml,我正在尝试附加一个克隆节点 <Property Id="3" Name="Deadline"></Property> 我使用的代码是: XmlDocument xmldoc = new XmlDocument(); xmldoc.Load("sample.xml"); foreach (string id in properties) { XmlNode props = xmldoc.DocumentElement.Sel

我正在尝试附加一个克隆节点

<Property Id="3" Name="Deadline"></Property>
我使用的代码是:

    XmlDocument xmldoc = new XmlDocument();
    xmldoc.Load("sample.xml");
    foreach (string id in properties)
    {
        XmlNode props = xmldoc.DocumentElement.SelectSingleNode("//Class[@Name='" + curClass + "']/Property[@Id='" + id + "']");

        XmlNode cloneNode = props.CloneNode(true);

        foreach (var item in dcList.SelectedItems)
        {
            XmlNodeList classes = commonMethods.LoadDocument(xml).DocumentElement.SelectNodes("//Class[@Name='" + item + "']/Property[last()]");
            foreach (XmlNode c in classes)
            {
                String propertyid = c.Attributes["Id"].Value.ToString();
                int.TryParse(propertyid, out value);
                value = value + 1;
                cloneNode.Attributes["Id"].Value = value.ToString();
                c.ParentNode.AppendChild(xmldoc.ImportNode(cloneNode,true));
                xmldoc.Save("sample.xml");
            }
        }
    }

我不确定这是否是输入错误,但似乎您正在对名为xml和get classes变量的变量调用commonMethods.LoadDocument方法。然后,在追加之前,将对xmlDoc调用ImportNode。节点需要导入到子节点将附加到的文档对象中。因此,如果您想附加到xmlDoc,您应该导入到xmlDoc中。

我冒昧地将代码重写为一个扩展方法,该方法允许您输入文件名、originalClassName、newClassName、要复制的节点名及其ID attributevalue

public static bool CopyNode(string fileName, string originalClassName, string newClassName, string nodeName, string ID)
{
    XDocument doc = XDocument.Load(fileName);

    if(doc == null)
        throw new ArgumentNullException("doc");

    XElement originalClassElement = doc.Root.Descendants().FirstOrDefault(e => e.Name == "Class" && e.Attribute("Name").Value == originalClassName);
    if (originalClassElement == null)
        return false;

    XElement elementToCopy = originalClassElement.Elements().FirstOrDefault(e => e.Name == nodeName && e.Attribute("Id").Value == ID);
    if (elementToCopy == null)
        return false;

    XElement newClassElement = doc.Root.Descendants().FirstOrDefault(e => e.Name == "Class" && e.Attribute("Name").Value == newClassName);
    if (newClassElement == null)
        return false;

    newClassElement.Add(elementToCopy);
    doc.Save(fileName);
    return true;
}
如果节点已正确复制,则该方法返回true。您已经获得了一些可扩展性,可以将节点复制到具有任何名称的类中或从中复制节点;以及要复制的任何节点(请注意,它们必须具有ID)

public static bool CopyNode(string fileName, string originalClassName, string newClassName, string nodeName, string ID)
{
    XDocument doc = XDocument.Load(fileName);

    if(doc == null)
        throw new ArgumentNullException("doc");

    XElement originalClassElement = doc.Root.Descendants().FirstOrDefault(e => e.Name == "Class" && e.Attribute("Name").Value == originalClassName);
    if (originalClassElement == null)
        return false;

    XElement elementToCopy = originalClassElement.Elements().FirstOrDefault(e => e.Name == nodeName && e.Attribute("Id").Value == ID);
    if (elementToCopy == null)
        return false;

    XElement newClassElement = doc.Root.Descendants().FirstOrDefault(e => e.Name == "Class" && e.Attribute("Name").Value == newClassName);
    if (newClassElement == null)
        return false;

    newClassElement.Add(elementToCopy);
    doc.Save(fileName);
    return true;
}