user1176737
user1176737

Reputation: 291

How to Read and Edit XML Nodes

I am fairly new to all of this and am struggling to find the answer, so any pointers in the right direction would be great.

I have an XML file from a system that I have no control over and it produces it like this:

<?xml version="1.0" ?>
<WatchConfig>
<ProcessList>
    <Process>
        <RunOnDesktop>0</RunOnDesktop>
        <DaysToKeepBackup>10</DaysToKeepBackup>
        <Scheduler>
            <Active>-1</Active>
            <Startup>0</Startup>
            <SelfRepl>0</SelfRepl>
            <MaxPercent>0</MaxPercent>
            <Delay>4</Delay>
            <AsSoon>-1</AsSoon>
            <OneTime>0</OneTime>
            <Period>0</Period>
            <Week>1</Week>
            <Interval>2</Interval>
        </Scheduler>
        <UniqueName>0ZISFZL6O6S5001</UniqueName>
        <Name>Process1</Name>
        <Group/>
        <MetaFileName/>
                 </Process>
    <Process>
        <RunOnDesktop>0</RunOnDesktop>
        <DaysToKeepBackup>10</DaysToKeepBackup>
        <Scheduler>
            <Active>0</Active>
            <Startup>0</Startup>
            <SelfRepl>0</SelfRepl>
            <MaxPercent>20</MaxPercent>
            <Delay>4</Delay>
            <AsSoon>-1</AsSoon>
            <OneTime>0</OneTime>
            <Period>0</Period>
            <Week>1</Week>
            <Interval>2</Interval>
        </Scheduler>
        <UniqueName>00ZJENPXPX1KL07</UniqueName>
        <Name>Process2</Name>
        <Group/>
        <MetaFileName/>
    </Process>
</ProcessList>
</WatchConfig>

What I would like to be able to do is to read through this and amend the Active value under the Scheduler node, ideally being able to specify the name of the process that I want to amend.(as there are two in this example)

Upvotes: 1

Views: 170

Answers (2)

Henk Holterman
Henk Holterman

Reputation: 273264

Easiest with XLinq:

var doc = XDocument.Load(fileName);
var p = doc.Descendants("Process")
      .Where(e => e.Element("UniqueName").Value == procName )
      .Single();

var a = p.Element("Scheduler").Element("Active");            
a.Value = "+1";

doc.Save(outFileName);

Upvotes: 3

rocha
rocha

Reputation: 63

Maybe you can try with something like LINQ

U can do this to load the XML

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;
public class EmployeeServices
{
    XElement _empXml = XElement.Load(@"employees.xml");
}

//And then to query the information u can do this

public List<string> GetDepartments()
{
  //query the XML and group by department
   // select only the departments in the group
   var deptQuery =
   from emp in _empXml.Descendants("Employee")
   group emp by emp.Element("Department").Value
   into empGroup
   select empGroup.First().Element("Department").Value;
   return deptQuery.ToList();
}

This is an example took from the MCTS book, hope it helps.

Upvotes: 1

Related Questions