2017-07-30 37 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! –

相關問題