Insert node in xml document using c#

11,233

When you do this:

XmlElement parentEle = doc.DocumentElement;
parentEle.AppendChild(xmlDocFrag);

You're appending the node to the root of the document. You probably wanted to select the actual readContract node that the item is supposed to be appended into. As an example:

XmlNode newNode = doc.CreateNode(XmlNodeType.Element, "productGroup", "");
newNode.InnerText = "something";

XmlNode readContractNode = doc["Envelope"]["Body"]["readContract"];
XmlElement groups = readContractNode["productGroups"];
readContractNode.InsertAfter(newNode, groups);

Of course you'd probably want to handle the case where there are already multiple child productGroup elements, but the idea is the same.

Share:
11,233
Madhan
Author by

Madhan

Updated on June 04, 2022

Comments

  • Madhan
    Madhan almost 2 years

    I was trying to insert an XML node in XML document at a specific position.

    This is my xml:

    <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Body>
            <readContract xmlns="http://implementation.company.schema.reference">
                <ContactNumbers>10158</ContactNumbers>
                <productGroups>0085</productGroups>
                <indicationBalanceInfo>false</indicationBalanceInfo>
                <indicationBlocked>true</indicationBlocked>
            </readContract>
        </Body>
    </Envelope>
    

    And am trying to insert another tag <productGroups>0093</productGroups> below to the tag <productGroups>0085</productGroups>

    Expecting like the below:

    <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Body>
            <readContract xmlns="http://implementation.company.schema.reference">
                <ContactNumbers>10158</ContactNumbers>
                <productGroups>0085</productGroups>
                <productGroups>0093</productGroups>
                <indicationBalanceInfo>false</indicationBalanceInfo>
                <indicationBlocked>true</indicationBlocked>
            </readContract>
        </Body>
    </Envelope>
    

    Used the below C# code to achieve it.

    XmlDocument doc = new XmlDocument();
    string inputxml = this.StServiceCallActivity5.InputEnvelope.InnerXml.ToString();
    //Here inputxml contains whole xml document.
    string addxml = "<productGroups>0093</productGroups>";
    doc.LoadXml(inputxml);
    XmlDocumentFragment xmlDocFrag = doc.CreateDocumentFragment();
    xmlDocFrag.InnerXml = addxml;
    XmlElement parentEle = doc.DocumentElement;
    parentEle.AppendChild(xmlDocFrag);
    

    And it returns value like

    <Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
        <Body>
            <readContract xmlns="http://implementation.company.schema.reference">
                <ContactNumbers>10158</ContactNumbers>
                <productGroups>0085</productGroups>
                <productGroups>0093</productGroups>
                <indicationBalanceInfo>false</indicationBalanceInfo>
                <indicationBlocked>true</indicationBlocked>
            </readContract>
        </Body>
        <productGroups xmlns="">0093</productGroups>
    </Envelope>
    

    Am a newbie to C# code, kindly help me to get the XML doc as expected. your help is much appreciated.