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;
}
}
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With