Search code examples
c#xmlxpathxmldocument

Update attribute value of an xml file using c#


I have a xml like the following..

I want to update the VALUE attribute of PARAMETER element inside the last IP element having PARAMCODE="cd3". The number of IP element is dynamically changing.

The SelectSingleNode(String) only selects the first XmlNode that matches the XPath expression.
I dont know the XPath expression for selecting last IP element.Please help me.

<?xml version="1.0"?>
<START>
  <TYPE CODE="1">
    <D1>
      <G1>100202</G1>
      <G2>01-10-2013 01:22:02</G2>      
    </D1>
    <D2>
      <INSTPARAM CODE="cd1" VALUE="212.94" >
      </INSTPARAM>
      <INSTPARAM CODE="cd2" VALUE="212.72" >
      </INSTPARAM>     
    </D2>
    <D4 INTERVALPERIOD="15">
      <DATA DATE="01-10-2013">
        <IP INTERVAL="1">
          <PARAMETER PARAMCODE="cd3" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd4" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd5" VALUE="0" >
          </PARAMETER>          
        </IP>
        <IP INTERVAL="2">
           <PARAMETER PARAMCODE="cd3" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd4" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd5" VALUE="0" >
          </PARAMETER> 
        </IP>
        <IP INTERVAL="3">
           <PARAMETER PARAMCODE="cd3" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd4" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd5" VALUE="0" >
          </PARAMETER> 
        </IP>
        <IP INTERVAL="4">
           <PARAMETER PARAMCODE="cd3" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd4" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd5" VALUE="0" >
          </PARAMETER> 
        </IP>
        <IP INTERVAL="5">
           <PARAMETER PARAMCODE="cd3" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd4" VALUE="0">
          </PARAMETER>
          <PARAMETER PARAMCODE="cd5" VALUE="0" >
          </PARAMETER> 
        </IP>
        <IP INTERVAL="6">
           <PARAMETER PARAMCODE="cd3" VALUE="0" > //need to update the value of VALUE  attribute of this element
          </PARAMETER>
          <PARAMETER PARAMCODE="cd4" VALUE="0" >
          </PARAMETER>
          <PARAMETER PARAMCODE="cd5" VALUE="0" >
          </PARAMETER> 
        </IP>
      </DATA>
    </D4>
  </TYPE>  
</START>

Solution

  • SelectSingleNode(string) doesn't necessarily return the first <IP> element, that depends on the XPath you used. You can try to simply add [last()] in your XPath to get the last matched element, for example :

    var ip = doc.SelectSingleNode("//IP[PARAMETER[@PARAMCODE='cd3']][last()]");
    ip.FirstChild.Attributes["VALUE"].Value = "100";