在xml文件中转换许多文本文件,保持相同的文件名C#

时间:2017-07-30 23:24:27

标签: c# xml linq xelement

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

我花了很多时间使用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

非常感谢!

2 个答案:

答案 0 :(得分:0)

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

  

XElement.Save方法(String

     

将此元素序列化为文件。

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

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

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

答案 1 :(得分: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($@"SomeOtherFolder\{outputFileName}.xml"))
            {
                var formatter = new XmlSerializer(typeof(DataLogName));
                formatter.Serialize(outFile, dataToSave);
            }
        }
    }
}