The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type

asp.net, asp.net-mvc-3, asp.net-mvc-4, c#, xml

Solution

The problem is that you are inserting an external xmlnode from different xml.

my edit is here, I use a workaround to load the xmlnode in the new document and then append it to your node

countNode.AppendChild(countNode.OwnerDocument.ImportNode(test, true));

try this solution

public void multipleXML()
        {
            XmlNode countNode = HandlingXmlDoc.CreateNode(XmlNodeType.Element, "Count", null);

            XmlNode productIdentifierNode = HandlingXmlDoc.CreateNode(XmlNodeType.Element, "ProductIdentifier", null);
            productIdentifierNode.InnerText = "123345";

            XmlNode countDateTimeNode = HandlingXmlDoc.CreateNode(XmlNodeType.Element, "CountDateTime", null);
            countDateTimeNode.InnerText = DateTime.Now.ToString();

            //XmlNode locationCountNode = HandlingXmlDoc.CreateNode(XmlNodeType.Element, "LocationCounts", null);

            countNode.AppendChild(productIdentifierNode);
            countNode.AppendChild(countDateTimeNode);
            var test = SetNewLocation("Bangalore", "30", "30");
            countNode.AppendChild(countNode.OwnerDocument.ImportNode(test, true));

            //countNode.AppendChild(test);//ERROR

            HandlingXmlDoc.SelectSingleNode("//SHandling//Counting//Counts").AppendChild(countNode);


        }

and another edit in SetNewLocation function

(my edit `return docCountXml.SelectSingleNode("LocationCount");`)

 private XmlNode SetNewLocation(String location, String casesQuantity, String singlesQuantity)
        {
            XmlDocument docCountXml = new XmlDocument();
            docCountXml.LoadXml(baseLocCountXML);

            SetValue(docCountXml, "LocationCount/Name", location);

            var xmlNodeList = docCountXml.SelectNodes("LocationCount/SCounts/SCount/Quantity");
            xmlNodeList[0].FirstChild.Value = casesQuantity;
            xmlNodeList[1].FirstChild.Value = singlesQuantity;

            return docCountXml.SelectSingleNode("LocationCount");
        }

for references here and here

Problem

I am dynamically building the xml through C# code and I get this error "The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong" This is my main class ``` internal class Program { private static void Main(string[] args) { CreateXml xml = new CreateXml(); xml.multipleXML(); } } ``` I have commented as “ERROR” below where i am getting run time exception. Please help how to fix this error. My Xml Class is here. ``` internal class CreateXml { private XmlDocument HandlingXmlDoc; private String baseHandlingXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?><SHandling><BLocation><SLocation><Identifier>02898</Identifier></SLocation></BLocation><Context><UserName>0289800001</UserName><Application>STOCK</Application></Context><Counting><SubmissionDateTime>2014-04-02T16:38:48.9345238+01:00</SubmissionDateTime><ProcessImmediately>YES</ProcessImmediately><Counts><Count><ProductIdentifier>050025488</ProductIdentifier><CountDateTime>2014-04-02T16:38:49.366567+01:00</CountDateTime><LocationCounts></LocationCounts></Count></Counts></Counting></SHandling>"; private XmlDocument locCountXmlDocument; private String baseLocCountXML = "<LocationCount><Name>Bangalore</Name><SCounts><SCount><Quantity>1</Quantity><UnitOfMeasure>CASES</UnitOfMeasure></SCount><SCount><Quantity>1</Quantity><UnitOfMeasure>SINGLES</UnitOfMeasure></SCount></SCounts></LocationCount>"; public CreateXml() { Initialise(); } public String GetStockHandlingXmlString { get { return HandlingXmlDoc.OuterXml; } } public XmlDocument GetStockHandlingXmlDocument { get { return HandlingXmlDoc; } } private void Initialise() { HandlingXmlDoc = new XmlDocument(); HandlingXmlDoc.LoadXml(baseHandlingXML); locCountXmlDocument = new XmlDocument(); locCountXmlDocument.LoadXml(baseLocCountXML); } public void multipleXML() { XmlNode countNode = HandlingXmlDoc.CreateNode(XmlNodeType.Element, "Count", null); XmlNode productIdentifierNode = HandlingXmlDoc.CreateNode(XmlNodeType.Element, "ProductIdentifier", null); productIdentifierNode.InnerText = "123345"; XmlNode countDateTimeNode = HandlingXmlDoc.CreateNode(XmlNodeType.Element, "CountDateTime", null); countDateTimeNode.InnerText = DateTime.Now.ToString(); //XmlNode locationCountNode = HandlingXmlDoc.CreateNode(XmlNodeType.Element, "LocationCounts", null); countNode.AppendChild(productIdentifierNode); countNode.AppendChild(countDateTimeNode); countNode.AppendChild(SetNewLocation("Bangalore","30","30"));//ERROR HandlingXmlDoc.SelectSingleNode("//SHandling//Counting//Counts").AppendChild(countNode); } private XmlNode SetNewLocation(String location, String casesQuantity, String singlesQuantity) { XmlDocument docCountXml = new XmlDocument(); docCountXml.LoadXml(baseLocCountXML); SetValue(docCountXml, "LocationCount/Name", location); var xmlNodeList = docCountXml.SelectNodes("LocationCount/SCounts/SCount/Quantity"); xmlNodeList[0].FirstChild.Value = casesQuantity; xmlNodeList[1].FirstChild.Value = singlesQuantity; return docCountXml.SelectSingleNode("/"); } private static void SetValue(XmlDocument xmlDocument, String key, String value) { var xmlNode = xmlDocument.SelectSingleNode(key); xmlNode.FirstChild.Value = value; } } ```

Original source