尝试附加克隆节点时可以说
<Property Id="3" Name="Deadline"></Property>
到类名为"AlphaCertificationsIndividual"
的同一文档中,但编译器给出了这个错误:要插入的节点来自不同的文档上下文
<Root>
<Class Name="ECMInstruction" Style="Top">
<Entity Id="1" Name="DocumentInformation" />
<Entity Id="2" Name="CustomerInformation" />
<Property Id="1" Name="DocumentTitle">
</Property>
<Property Id="2" Name="DateCreated">
<Lists>
<ListName>ws_Users</ListName>
<ListName>dfdfdfd</ListName>
</Lists>
</Property>
<Property Id="3" Name="Deadline">
</Property>
</Class>
<Class Name="AlphaCertificationsIndividual" Style="Top">
<Entity Id="1" Name="DocumentInformation" />
<Property Id="1" Name="DocumentTitle">
</Property>
<Property Id="2" Name="DateCreated">
<Lists>
<ListName>ws_Users</ListName>
<ListName>dfdfdfd</ListName>
</Lists>
</Property>
<Property Id="3" Name="Deadline">
</Property>
</Class>
</Root>
代码正在使用:
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");
}
}
}
答案 0 :(得分:1)
我不确定它是否是一个拼写错误,但似乎你在一个名为xml的变量上调用commonMethods.LoadDocument方法并获取类变量。然后,在追加之前,在xmlDoc上调用ImportNode。需要将节点导入到将附加子项的文档对象中。因此,如果要附加到xmlDoc,则应导入xmlDoc。
答案 1 :(得分:0)
我冒昧地将您的代码重写为扩展方法,该方法允许您输入fileName,originalClassName,newClassName,要复制的节点的名称及其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;
}
如果已正确复制节点,则该方法返回true。您已经获得了一些可扩展性,并且可以使用任何名称将节点复制到类中;以及你想要复制的任何节点(注意它们必须有一个ID)。