将 Web 表单中的 XML 响应更改为 CSV 文件

Posted

技术标签:

【中文标题】将 Web 表单中的 XML 响应更改为 CSV 文件【英文标题】:Change XML response in web form into CSV file 【发布时间】:2011-06-15 21:36:19 【问题描述】:

您好,我有以下已编辑的应用程序代码 -

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

我的问题是我使用获取结果的方法将结果加载到 Web 表单中以进行演示。但是现在我想将 xml 响应加载到 CSV 文件中并将该文件自动保存到特定路径,我不再需要将应用程序作为 Web 表单,并且不知道如何执行此操作。

这是响应 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 文件看起来像 -

日期、时间、factSent、ComSent、factSum、comSum、错误、位置、状态 26/01/2011,14:00,24,15,24,15,人[123]未知,0,lineFault

我已经尝试过 StringBuilder SbCSV 但无法让它工作,因为我不确定如何更改现有代码以使用它。 我还尝试使用看起来像的 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,我认为模板配置不正确。

任何帮助都将不胜感激,并感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

我不完全确定我是否遵循了您遇到的问题,但是从适当的模板创建一个新项目并粘贴到相关的基于 stringbuilder 的代码中是否比尝试修改您的 Web 服务项目更容易?

【讨论】:

我只需要将结果保存为 csv 格式,然后保存到特定位置,但仍然绞尽脑汁! 解析您的输入并随时创建 StringBuilder 是构建 CSV 版本的正确方法,恕我直言,并且在最后保存到磁盘很简单。我仍然不太确定我是否遵循了确切的问题,但这似乎与将项目从作为 Web 服务输出转换为生成此文本文件有关。在这种情况下,使用更合适的基本模板(例如 Windows / 控制台应用程序)并将相关代码粘贴到其中的新项目可能会让您的生活更简单。【参考方案2】:

这在chat 中进行了讨论,得出以下结论:

目标是从 Web 表单写入文件响应,如 here 所述 通过 xslt 将输入 xml 转换为目标 csv 几乎涵盖了(碰巧,很像 here) 要编写 csv,我们要设置“content-type”和“content-dispositon”标头,如 here 所讨论的那样

【讨论】:

以上是关于将 Web 表单中的 XML 响应更改为 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何将xml响应更改为json?

如何将xml响应更改为json?

将字符串更改为日期的问题

如何在 Angular 中将此模板驱动的表单更改为反应式表单?

在移动设备上将 Bootstrap 布局从内联表单更改为网格

magnific popup:以编程方式将内容从弹出表单更改为模态微调器,然后返回表单