private XmlNode CloneTreeInternal(DataPointer other) { Debug.Assert(_ignoreDataSetEvents == true); Debug.Assert(_ignoreXmlEvents == true); Debug.Assert(IsFoliationEnabled == false); // Create the diconnected tree based on the other navigator XmlNode newNode = CloneNode(other); DataPointer dp = new DataPointer(other); try { dp.AddPointer(); if (newNode.NodeType == XmlNodeType.Element) { int cAttributes = dp.AttributeCount; for (int i = 0; i < cAttributes; i++) { dp.MoveToOwnerElement(); if (dp.MoveToAttribute(i)) { newNode.Attributes.Append((XmlAttribute)CloneTreeInternal(dp)); } } dp.MoveTo(other); } for (bool fMore = dp.MoveToFirstChild(); fMore; fMore = dp.MoveToNextSibling()) newNode.AppendChild(CloneTreeInternal(dp)); } finally { dp.SetNoLongerUse(); } return newNode; }