【问题标题】:Need to match the csv and template string to generate xml需要匹配csv和模板字符串生成xml
【发布时间】:2015-03-30 12:57:58
【问题描述】:

我需要根据匹配 csvString 和模板字符串中的确切标头值来生成 XML。请指教。

实现此目的的代码:(我在下面编写了将 csvString 转换为 XML 的代码,并且在 csvString 没有标题列且只有数据行的情况下工作。需要实现进行匹配并分配值)

//Defining the final template
            string template = "Header2,Header3,Header1,Header4";
            //Defining the csvString. the 1st line is the header. each line is separated by '///'. each column is separated by ','  
            string csvString = "row11,row12,row13,row14///row21,row22,row23,row24///row31,row32,row33,row34";

            string[] split = template.Split(',');

            // Read into an array of strings.
            string[] source = csvString.Split(new string[] { "///" }, StringSplitOptions.None);
            XElement cust = new XElement("Clients",
            from str in source
            let fields = str.Split(',')
            select new XElement("Client", split.Zip(fields, (name, value) => new XElement(name, value)))
        );

任何帮助或指向正确方向的指针都会很有用。 需要让它匹配,例如,基于此:

string csvString = "Header1,Header2,Header3,Header4///row11,row12,row13,row14///row21,row22,row23,row24///row31,row32,row33,row34";

【问题讨论】:

  • 我不确定你到底要什么。使用 XSLT 可以轻松地生成基于模板和数据的 XML。您需要在这里更具体一点才能获得足够的帮助。
  • 基于问题末尾的 csv 字符串标题的值,我需要根据模板字符串中标题的顺序排列这些值。
  • 您认为将 csv 字符串存储到数据表中是否是一种好习惯。然后根据模板字符串对数据表列重新排序。然后将数据表转换为类似于csv字符串的字符串。并使用与上面相同的代码生成xml。
  • 我知道可以使用 xslt 模板来完成。我们有 1000 个客户,每个客户都有不同的模板列值。为每个客户端生成 xslt 是一项艰巨的任务。因此,为简单起见,我们使用普通的 .net 和 linq
  • 嗯,我打算将 csv 字符串转换为 .net 数据表,然后根据模板字符串设置列。任何其他方法都值得赞赏。

标签: c# .net xml linq


【解决方案1】:

我认为对于这种特定情况,您可以实现一个自定义比较器来对标题字符串进行排序,并按尾随数字对标题数组进行排序。行看起来已经排序,所以它们稍后会匹配。

这是自定义字符串比较器:

public class ByNumberAtStringEnd : IComparer<string>
{
    public int Compare(string x, string y)
    {
        var num1 = Int32.Parse(System.Text.RegularExpressions.Regex.Match(x, "\\d+$").Value);
        var num2 = Int32.Parse(System.Text.RegularExpressions.Regex.Match(y, "\\d+$").Value);
        return num1.CompareTo(num2);
     }
}

在代码中使用:

...
string template = "Header2,Header3,Header1,Header4";
//Defining the csvString. the 1st line is the header. each line is separated by '///'. each column is separated by ','  
string csvString = "row11,row12,row13,row14///row21,row22,row23,row24///row31,row32,row33,row34";
List<string> split = template.Split(',').ToList();
// --------------------------------------------- SORT THE HEADERS!!!
split.Sort(new ByNumberAtStringEnd());
// Read into an array of strings.
string[] source = csvString.Split(new string[] { "///" }, StringSplitOptions.None);
var elements = from str in source
               let fields = str.Split(',').ToList()
               select new XElement("Client", split.Zip(fields, (name, value2) => new XElement(name, value2)));

XElement cust = new XElement("Clients");
cust.Add(elements);

输出:

<Clients>
  <Client>
    <Header1>row11</Header1>
    <Header2>row12</Header2>
    <Header3>row13</Header3>
    <Header4>row14</Header4>
  </Client>
  <Client>
    <Header1>row21</Header1>
    <Header2>row22</Header2>
    <Header3>row23</Header3>
    <Header4>row24</Header4>
  </Client>
  <Client>
    <Header1>row31</Header1>
    <Header2>row32</Header2>
    <Header3>row33</Header3>
    <Header4>row34</Header4>
  </Client>
</Clients>

【讨论】:

  • 输出应该在匹配的标题下有相应的数据。示例:header2 必须具有值 row12。 Header3 值 row13。 Header1 值 row11.header4 值 row14。编写的代码与我提供的代码给出相同的输出
  • 我写的代码提供的输出和你写的一样。
  • 嗯,我打算将 csv 字符串转换为 .net 数据表,然后根据模板字符串设置列。任何其他方法都值得赞赏。
  • @helloworld:我更新了代码,请看一下。
  • 很抱歉造成任何误解。我再说一遍。 xml 顺序应该和模板顺序一样。在我的问题中有 h2 h3 h1 h4。输出应该尊重这一点。您的输出给出 h1 h2 h3 h4 顺序。你现在找到我了吗
猜你喜欢
  • 1970-01-01
  • 2018-08-03
  • 2014-11-19
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
相关资源
最近更新 更多