1

I have the following code which will save to XML file,

   private bool CreateAutoGeneratedReportsXML(string ReportName, int ReportId, string ConnectionString, string ReportBQuery, string ReportColName,string starttime,string endtime,string dailytime,bool daily,bool weekly,bool monthly,bool yearly)
    {
        string dir = "C:\\ReportManager\\";
        string fname="AutoReport.xml";
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }

        List<AutoReportXML> objAutoReportXML = new List<AutoReportXML>();

        XmlSerializer objSerializer = new XmlSerializer(typeof(List<AutoReportXML>));
        if(!File.Exists(dir+fname))
        {
            AutoReportXML objx = new AutoReportXML();


            objAutoReportXML.Add(new AutoReportXML() { ReportName = ReportName, ReportID = ReportId, ConnectionString = ConnectionString,
                ReportBQuery = ReportBQuery, ReportColumnName = ReportColName, StartTime = starttime,
                EndTime = endtime, DailyTime = dailytime, Daily = daily, Weekly = weekly, Monthly = monthly, Yearly = yearly });

            using(FileStream fs=new FileStream(dir+fname,FileMode.Create,FileAccess.Write))
            {
                objSerializer.Serialize(fs, objAutoReportXML);
                fs.Close();
            }
        }
        else{
            using (FileStream fs = new FileStream(dir + fname, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {

                objAutoReportXML=objSerializer.Deserialize(fs) as List<AutoReportXML>;

                if (!objAutoReportXML.Any(x => x.ReportName.Contains(ReportName)))
                {
                    AutoReportXML objx=new AutoReportXML();
                    XElement x;
                    if (fs.Position > 0)
                    {
                        fs.Position = 0;
                        x = XElement.Load(fs);
                        x = new XElement("ArrayOfAutoReportXML",                                
                        new XAttribute("ReportName", ReportName),
                        new XAttribute("ReportID", ReportId),
                        new XAttribute("ConnectionString", ConnectionString),
                        new XAttribute("ReportBQuery", ReportBQuery),
                        new XAttribute("ReportColumnName", ReportColName),
                        new XAttribute("StartTime",starttime),
                        new XAttribute("EndTime",endtime),
                        new XAttribute("DailyTime",dailytime),
                        new XAttribute("Daily",daily),
                        new XAttribute("objx.Weekly",weekly),
                        new XAttribute("Monthly",monthly),
                        new XAttribute("Yearly",yearly));


                    x.Save(fs);
                    }



                }
                else {

                }
            }
            }
        return true;
    }

my output for the above code is like below:

 <?xml version="1.0" encoding="utf-8"?>
<ArrayOfAutoReportXML ReportName="tff" ReportID="17" ConnectionString="server='KHASIM-PC\SQLEXPRESS';uid='sa';pwd='khasim123';database='ReportMgr'" ReportBQuery="SELECT t0.testid, t0.pt500, t0.pt600, t0.cdt  FROM sampletest t0 WHERE  t0.cdt BETWEEN @VALUE1 and @VALUE2" ReportColumnName="cdt" StartTime="12:46:50" EndTime="12:46:50" DailyTime="12:46:50" Daily="false" objx.Weekly="false" Monthly="false" Yearly="false" /><?xml version="1.0"?>
<ArrayOfAutoReportXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

I want the output to be like below, adding attributes instead of creating child nodes:

<?xml version="1.0"?>
<ArrayOfAutoReportXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <AutoReportXML ReportName="hourslyshifta" ReportID="34" StartTime="10:00:00" EndTime="17:00:00" ... >
<AutoReportXML ReportName="hourslyshifta" ReportID="34" StartTime="10:00:00" EndTime="17:00:00" ... >
<AutoReportXML ReportName="somename" ReportID="34" StartTime="10:00:00" EndTime="17:00:00" ... >
<AutoReportXML ReportName="othername" ReportID="34" StartTime="10:00:00" EndTime="17:00:00" ... >
<AutoReportXML ReportName="firstname" ReportID="34" StartTime="10:00:00" EndTime="17:00:00" ... >
<AutoReportXML ReportName="quickreport" ReportID="34" StartTime="10:00:00" EndTime="17:00:00" ... >

</ArrayOfAutoReportXML>

how to change my code to add attributes instead of creating child nodes.

Tan
  • 778
  • 3
  • 18
  • 36

1 Answers1

1

You can use:

XElement x;
XAttribute attribute = new XAttribute("AttributeName", object);
x.Add(attribute);

Or:

XElement x = new XElement("AutoReportXML",
    new XAttribute("ReportName", "somename"),
    new XAttribute("ReportID", 34)
    /* , add more here */);
NoName
  • 7,940
  • 13
  • 56
  • 108
  • thank you i am getting one more error this line is getting addded with each new node creation can you please help me why – Tan Feb 27 '16 at 07:01
  • Can you update your new code? I can only check if I see the code. – NoName Feb 27 '16 at 07:06
  • i think for the part if(!file.exists) the code need to be updated. i have updated the code – Tan Feb 27 '16 at 07:24
  • Problem is you use `List`. You have to create a [root XML node](http://stackoverflow.com/a/2948356/1560697), then add `AutoReportXML` elements to it. – NoName Feb 27 '16 at 07:35