2016-02-27 3 views
1

je le code suivant qui sauvera un fichier XML,comment ajouter des attributs à XML à l'aide xml sérialiseur

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; 
    } 

ma sortie pour le code ci-dessus est comme ci-dessous:

<?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" /> 

Je veux la sortie doit être comme ci-dessous, en ajoutant des attributs au lieu de créer des nœuds enfants:

<?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> 

comment changer mon code pour ajouter des attributs tead de créer des noeuds enfants.

Répondre

1

Vous pouvez utiliser:

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

Ou:

XElement x = new XElement("AutoReportXML", 
    new XAttribute("ReportName", "somename"), 
    new XAttribute("ReportID", 34) 
    /* , add more here */); 
+0

merci je reçois encore une erreur de cette ligne est ajouté avec chaque nouvelle création de noeud pouvez-vous m'aider s'il vous plaît pourquoi – Tan

+0

Pouvez-vous mettre à jour votre nouveau code? Je peux seulement vérifier si je vois le code. – Sakura

+0

Je pense que pour la partie si (! Fichier.exists) le code doit être mis à jour. J'ai mis à jour le code – Tan