Изменить XML-ответ в веб-форме в файл CSV - PullRequest
1 голос
/ 26 января 2011

Привет, у меня есть следующий отредактированный код приложения -

 public partial class ConvertApp : Form

 {

     public ConvertApp()
    {
        InitializeComponent();  
   }
    static webservice.Results res= new webservice.Results(out int factSent,out int ComSent)
    private static webservice.Results convert()
    {
        string csv = File.ReadAllText("C:\\test.txt");
        string year = "1000" ;
        XDocument doc = ConvertCsvToXML(csv, new[] { "," });

        webservice.Feed CallWebService = new webservice.Feed();

    int recordAmount=0; 
        factSent = 0;
        ComSent = 0;
        foreach(XElement el in doc.Descendants("row"))
        {
             recordAmount = recordAmount+1;
        } 
        webservice.Summary[] Summary = new webservice.Summary[recordAmount];
        int i=0;

        foreach(XElement el in doc.Descendants("row"))
        {
            Summary[i] = new webservice.Summary();
            Summary[i].person = el.Descendants("var").Where(x => (string)x.Attribute("name") == "person").SingleOrDefault().Attribute("value").Value;
            Summary[i].fact = System.Convert.ToInt32(el.Descendants("var").Where(x => (string)x.Attribute("name") == "fact").SingleOrDefault().Attribute("value").Value);
            Summary[i].com = System.Convert.ToInt32(el.Descendants("var").Where(x => (string)x.Attribute("name") == "com").SingleOrDefault().Attribute("value").Value);
            Summary[i].Centre = el.Descendants("var").Where(x => (string)x.Attribute("name") == "Centre").SingleOrDefault().Attribute("value").Value;
            Summary[i].CCentre = el.Descendants("var").Where(x => (string)x.Attribute("name") == "CCentre").SingleOrDefault().Attribute("value").Value;
        factSent += Summary[i].fact;    
        ComSent +=Summary[i].com;
        i=i+1;
        }
        webservice.Results res = CallWebService.updateStatus(Summary, year);
        return res;
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        int factSent;
        int ComSent;
        webservice.Results returned = convert(out factSent, out ComSent);
        txtResult.Text = System.Convert.ToString(returned.status);
        txtMoreRes.Text = returned.errorDetails[i].errorDetails;
        factSum.Text = System.Convert.ToString(returned.factSum);
        comSum.Text = System.Convert.ToString(returned.comSum);
        factSumSent.Text = factSent.ToString();
        comSumSent.Text = ComSent.ToString();
        time.Text = System.Convert.ToString(DateTime.Now.TimeOfDay);
        date.Text = System.Convert.ToString(DateTime.Today);     
        lineFault.Text = System.Convert.ToString(returned.errDetails[i].lineFault);
       }

Моя проблема в том, что я использовал метод получения результатов для загрузки в веб-форму в демонстрационных целях.Однако теперь я хочу получить XML-ответ для загрузки в CSV-файл и автоматически сохранить этот файл по определенному пути. Мне больше не нужно, чтобы приложение представляло собой веб-форму, и я не уверен, как это сделать.

Вот пример XML-ответа -

<return>
                    <factSum>24</factSum>
                    <comSum>15</comSum>
                    <errDetails>
                          <errors>The person [123] is unknown , The
                                centre [14] is unknown </errors>
                          <Position>0</Position>
                    </errDetails>
                    <status>lineFault</status>
              </return>
    </ns2:FeedResponse>
</S:Body>

И я хочу, чтобы файл .CSV выглядел примерно так:

дата, время, факт отправлено, ComSent, factSum, comSum, ошибки, позиция, статус 26/01 / 2011,14: 00,24,15,24,15, человек [123] неизвестен, 0, lineFault

Я пробовал StringBuilderSbCSV, но не смог заставить его работать, так как я не был уверен, как изменить мой существующий код, чтобы использовать его.Я также попытался использовать шаблон XLS using System.Configuration; и System.Xml.Xsl;, который выглядел как -

<xsl:template match="//return".
<xsl:value-of select="factsum">
//etc
</xsl:template>

А затем вынул - private void Form1_Load(object sender, EventArgs e) и ввел

static void Main(string[] args)
{
   string oldXML = ConfigurationSettings.AppSettings["res"];
   string xsltLocation = ConfigurationSettings.AppSettings["Path to where xsl template is saved"];
   string new CSV = ConfigurationSettings.AppSettings["Path to where I want the new CSV to go"];

   XslCompiledTransform transform = new XslCompiledTransform();
   transform.Load("Path to where xsl template is saved");
   transform.Transform(oldXML, newCSV);
}

Это, однако, далоУ меня проблемы с public partial class ConvertApp : Form , а также с тем, что это static void Main, и я думаю, что шаблон был настроен неправильно.

Любая помощь будет принята с благодарностью и спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 27 января 2011

Это обсуждалось в чате со следующими выводами:

  • цель состоит в том, чтобы написать ответ файла из веб-формы, как описано здесь
  • перевод входного xml в целевой CSV в значительной степени покрыт, через xslt (как это происходит, в значительной степени похоже на здесь )
  • и на запись CSVмы хотим установить заголовки «content-type» и «content-dispositon», как обсуждено здесь
0 голосов
/ 26 января 2011

Я не совсем уверен, что слежу за вашей проблемой, но может быть проще создать новый проект из соответствующего шаблона и вставить в соответствующий код на основе строителя строк, чем пытаться изменить проект вашего веб-сервиса?

...