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