【问题标题】:Convert flat text file to XML in C#在 C# 中将平面文本文件转换为 XML
【发布时间】:2016-07-20 14:49:54
【问题描述】:

我有一个.txt 文件,我必须在xml 文件中更改它。我的.txt 文件是pipe-delimited ("|", vertical bar) 纯文本文件。 像这样:

169055|759656025621|Dos|Justamente Tres|Kill Rock Stars|256|PUNK|CD-JEWEL CASE|06/24/1996|D

现在我必须将此文本文件更改为 xml 文件,并且我必须为此 xml 添加父子节点。 我必须使用 Linq to xml 和 XElement。 请帮帮我。

【问题讨论】:

  • 读入数据。处理它。并再次写出来。这看起来可以使用“CSV”阅读器/库(配置为“PSV”)读取。对于[重新]连接亲子关系,我wrote this answer可能会或可能不会提供一些有用的想法。
  • 我投票为“不是真正的问题”。如果将特定问题提交到桌面上,SO 效果最好 - 就像现在一样,这是一个没有足够细化的任务。
  • 1) 显示 xml 示例。 2)显示txt的例子。 3) 显示您现在拥有的代码。目前也在投票结束问题
  • 我只有 RDF 文件,我必须使用 Linq to Xml 将其解析为 xml。 169055|759656025621|Dos|Justamente Tres|Kill Rock Stars|256|PUNK|CD-JEWEL CASE|06/24/1996|D 这些是该文件的行。我必须将他们的节点添加为 PID|UPC/EAN|Artist|Title|Label|CatalogNumber|Genre|Format|ReleaseDate|Distribution。

标签: c# xml linq-to-xml xelement


【解决方案1】:
//path of your RDF file i.e. txt file used delimeter |

String filePath = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"RdfFile/RDF.txt");

IEnumerable<String> source = File.ReadLines(filePath);

 XElement scans = new XElement("Test",


        from str in source
        let fields = str.Split('|')
        select new XElement("Product",
           new XAttribute("Action", FileName),
           new XAttribute("EnsureDefaultVariant", "1"),
           new XAttribute("ID", fields[0]),



            new XElement("Summary", fields[2]),
            new XElement("ImageFilenameOverride", fields[1])


            )

    );
//path in which xml file you want to save result.

 String filePath_Xml = Path.Combine(HostingEnvironment.ApplicationPhysicalPath,
 @"XMLFile/RDF__Scans_Add_XMLFile.xml");

 scans.Save(filePath_Xml);

【讨论】:

    【解决方案2】:

    将您的输入文本文件放置为c:\sample.txt。包含类似的行(分隔符的数量可能会有所不同,每条记录都会产生更多或更少的字段):

    169055|759656025621|Dos|Justamente Tres|Kill Rock Stars|256|PUNK|CD-JEWEL CASE|06/24/1996|D
    xx|xx|xx|xx|xx|xx|xx|xx|xx|xx
    ...
    

    然后你可以这样开始:

    public static void Main() {
                XElement root = new XElement("root");//create a root node
                foreach (String ln in File.ReadAllLines(@"c:\sample.txt")){//<-- read lines
                    string[] fields = ln.Split('|'); //<-- change field separator here & split fields
                    XElement record = new XElement("record"); //create a child node (i.e., parent of filelds)
                    int pos = 0;
                    foreach (String sp in fields){
                        pos += 1;
                        XElement field = new XElement(string.Format("field_{0}", pos.ToString())); // prepare child nodes
                        field.Add(sp);
                        record.Add(field); // add to parent node
                    }
                    root.Add(record); // add to root
                }
                Console.Write (root.ToString());  // display the result on console
                Console.ReadKey(); // waiting for you........
            }
    

    控制台结果:

    <root>
      <record>
        <field_1>169055</field_1>
        <field_2>759656025621</field_2>
        <field_3>Dos</field_3>
        <field_4>Justamente Tres</field_4>
        <field_5>Kill Rock Stars</field_5>
        <field_6>256</field_6>
        <field_7>PUNK</field_7>
        <field_8>CD-JEWEL CASE</field_8>
        <field_9>06/24/1996</field_9>
        <field_10>D</field_10>
      </record>
      <record>
        <field_1>xx</field_1>
        <field_2>xx</field_2>
        <field_3>xx</field_3>
        <field_4>xx</field_4>
        <field_5>xx</field_5>
        <field_6>xx</field_6>
        <field_7>xx</field_7>
        <field_8>xx</field_8>
        <field_9>xx</field_9>
        <field_10>xx</field_10>
      </record>
    </root>
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-18
      • 2011-05-27
      • 2012-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      相关资源
      最近更新 更多