2017-07-30 40 views
-1

已更新 - 我试图用C#将很多文本文件(最多3K文件)转换为XML文件。 我想遵循两个步骤: 1)使用特定的分隔符“:”获取一些数据。 2)使用* .txt文件的相同名称在另一个文件夹中创建* .xml文件。转换XML文件中的许多文本文件,保持相同的文件名C#

我花了很多时间从文本文件中使用LINQ获取数据信息,并且所有数据都是正确的。我被困在如何发送这些数据到XML文件并保存。

这是我第一次使用文本文件和XML,任何帮助将非常感激。

下面的代码:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Xml.Linq; 
using System.Xml.Serialization; 

namespace TxT2XML 
{ 
    class Program 
    { 
     private static void Main(string[] args) 
     { 
      string path = @"C:\Users\wcks\Documents\Visual Studio 2015\Projects\TxT2XML\Data_TXT_Files\"; 

      string[] fileEntries = Directory.GetFiles(path); 

      Dictionary<string, string[]> dicData = new Dictionary<string, string[]>(); 

      foreach (string fileName in fileEntries) 
      { 
       if (!File.Exists(path)) 
       { 
        string[] contents = new string[100]; 
        string fieldDateLogged = "Date Logged:"; 
        string fieldTaskName = "Task Name:"; 
        string fieldUserID = "User ID:"; 

        var lines = File.ReadAllLines(fileName); 
        contents[0] = lines.Where(x => x.Contains(fieldDateLogged)).FirstOrDefault().Replace(fieldDateLogged, string.Empty).Trim(); 
        contents[1] = lines.Where(x => x.Contains(fieldTaskName)).FirstOrDefault().Replace(fieldTaskName, string.Empty).Trim(); 
        contents[2] = lines.Where(x => x.Contains(fieldUserID)).FirstOrDefault().Replace(fieldUserID, string.Empty).Trim(); 

        XElement xElem = new XElement(fieldTaskName, dicData.Select(x => new XElement("DataLogName", new XAttribute(fieldTaskName, x.Key), new XAttribute(contents[0], x.Value)))); 
        var xml = xElem.ToString(); 
        Console.Write(xml); 
       } 
      } 
     } 
    } 
} 

class DataLogName 
{ 
    [XmlAttribute] 
    public string DataLogged { set; get; } 

    [XmlAttribute] 
    public string TaskName { set; get; } 

    [XmlAttribute] 
    public string UserID { set; get; } 
} 

预期的XML输出:

<DataLogName> 
    <DataLogged>01-01-2017<DataLogged> 
    <TaskName>Project Name<TaskName> 
    <UserID>123456<UserID> 
<DataLogName> 

文本文件样本:

  SOFTWARE DATA LOG Data Log 

Date Logged:  09-29-2014 02:17:45 PM 
Task Name:  PROJECT_NAME 
User ID:  Administrator Mode 
System:   COMPUTER_XPTO 
Machine ID:  XXXXXXXX 

Device:   XXXXXXXXXXXXXX 
Data Source:  c:\ROOT\FOLDER\X.BIN 
Sumcheck:  5DC95067 
Process:  XXXXXXX/XXXXX/XXXXX/XXXXXX 

非常感谢!

+0

所有的文本文件都是相同的格式/模式?以及你想从文本文件构建XML的结构是什么?文本文件内容和期望的XML输出示例会有所帮助? –

+0

@Venkatesh Muniyandi - 主线程已更新。 –

回答

0

我会用一个XmlSerializer保存到一个文件中。下面演示了一个例子。 XElement可以更轻松地完成特定的事情,但对于像您这样的简单结构,我发现这种方法更简洁。

using System; 
using System.IO; 
using System.Xml.Serialization; 

namespace XmlPlayground 
{ 
    public class DataLogName 
    { 
     public DateTime DateLogged { get; set; } 
     public string TaskName { get; set; } 
     public string UserId { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var fileName = "myfile.txt"; 

      // TODO: Load File from text file 
      var dateLogged = DateTime.Now; 
      var taskName = "Example Task"; 
      var userId = "Fred1"; 

      // Populate structure 
      var dataToSave = new DataLogName { DateLogged = dateLogged, TaskName = taskName, UserId = userId }; 

      // Save File 
      var outputFileName = Path.GetFileNameWithoutExtension(fileName); 

      using (var outFile = File.Create([email protected]"SomeOtherFolder\{outputFileName}.xml")) 
      { 
       var formatter = new XmlSerializer(typeof(DataLogName)); 
       formatter.Serialize(outFile, dataToSave); 
      } 
     } 
    } 
} 
+0

非常感谢!作品!!! –

0

XElement有一个Save方法,该方法采用字符串 - 该文件的内容也应写入XElement的内容的路径。

XElement.Save方法(String

序列化此元件到一个文件。

您可以使用它将其保存到文件中。

您可以使用您的Path.ChangeExtension路径上更换扩展:

var outputFilePath = Path.ChangeExtension(fileName, ".xml"); 
xElem.Save(outputFilePath); 
+0

谢谢MarcinJuraszek! –

相关问题