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>
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";