Reputation: 788
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
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