Tan
Tan

Reputation: 788

how to add attributes to xml using xml serializer

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.

Upvotes: 1

Views: 119

Answers (1)

NoName
NoName

Reputation: 8025

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 */);

Upvotes: 1

Related Questions