XML : How to remove repeated node details in xml?

I have xml file like following.

  <Root>        <Main Name="Install">          <Details>Success</Details>          <Maintain>Install period</Maintain>        </Main>      <Main Name="Uninstall">          <Details>failure</Details>          <Maintain>uninstall period</Maintain>        </Main>       <Main Name="Discard">          <Details>failure</Details>          <Maintain>discard period</Maintain>        </Main>       <Main Name="Install">          <Details>Done</Details>          <Maintain>Got Output</Maintain>        </Main>      </Root>    

I need only last latest update to print in xml.

I've used following code and found output.

  XDocument xDoc1 = XDocument.Load(inputFileName);            var elems = xDoc1.Element("Root").Elements("Main");            XElement xInstall = elems.LastOrDefault(a => a.Attribute("Name").Value == "Install");          XElement xUninstall = elems.LastOrDefault(a => a.Attribute("Name").Value == "Uninstall");          XElement xDiscard = elems.LastOrDefault(a => a.Attribute("Name").Value == "Discard");            XDocument xdoc2 = new XDocument();            xdoc2.Add(              new XElement("Root", new XElement[]              {                  xInstall,                  xDiscard,                  xUninstall              })          );            xdoc2.Save(ouputFileName);    

But while using this same logic in foreach loop I can't get correct output. My code is,

  XmlDocument xml = new XmlDocument();  string xmlLocation = @"C:\Input.xml";  xml.Load(xmlLocation);  XmlNodeList MainNameList = xml.SelectNodes("/Root/Main");    XDocument xDoc1 = XDocument.Load(@"C:\Input.xml");    var elems = xDoc1.Element("Root").Elements("Main");  XDocument xdoc2 = new XDocument();  xdoc2.Add(new XElement("Root"));  foreach (XmlNode MainNode in MainNameList)  {      string mainName = MainNode.Attributes[0].Value;      XElement MainNode = elems.LastOrDefault(a => a.Attribute("Name").Value == mainName);          xdoc2.Root.Add(new XElement("Root", new XElement(MainNode)));    }    xdoc2.Save(@"C:\Output.xml");    

the output came like following:

  <Root>    <Main Name="Install">      <Details>Success</Details>      <Maintain>Naveen</Maintain>    </Main>    <Main Name="Uninstall">      <Details>failure</Details>      <Maintain>uninstall period</Maintain>    </Main>    <Main Name="Discard">      <Details>failure</Details>      <Maintain>discard period</Maintain>    </Main>    <Main Name="Install">      <Details>Success</Details>      <Maintain>Naveen</Maintain>    </Main>  </Root>    

But I need output like following:

  <Root>   <Main Name="Uninstall">     <Details>failure</Details>      <Maintain>uninstall period</Maintain>   </Main>   <Main Name="Discard">      <Details>failure</Details>      <Maintain>discard period</Maintain>   </Main>  <Main Name="Install">      <Details>Done</Details>      <Maintain>Got Output</Maintain>   </Main>  </Root>    

What is the mistake i had on my code? Please help me on this for get correct output by using foreach loop. Because I had so many main elements in my xml. thanks in advance.

No comments:

Post a Comment