Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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;
        }
    }
like image 494
Sanju Rao Avatar asked Jun 05 '14 07:06

Sanju Rao


1 Answers

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

like image 143
faby Avatar answered Oct 14 '22 00:10

faby