遍历目录中的每个文件并将输出写入文本

时间:2014-03-26 15:55:52

标签: c# xml

我在一个文件夹中有大约15,000个XML文件,XML文件名的例子是; 000010000.img.xml

每个XML文件都包含我在单个文本文件中需要的特定信息。

除了显示的信息外,每个XML文件都具有完全相同的结构。

以下是我想要关注的内容(在XML文件中)

<imgdir name="000010000.img">
   <imgdir name="info">
      <int name="version" value="10" />
      <int name="cloud" value="0" />
      <int name="town" value="0" />
      <float name="mobRate" value="1.0" />
      <string name="bgm" value="Bgm34/MapleLeaf" />
      <int name="returnMap" value="10000" />
      <string name="mapDesc" value="" />
      <int name="hideMinimap" value="0" />
      <int name="forcedReturn" value="999999999" />
      <int name="moveLimit" value="0" />
      <string name="mapMark" value="MushroomVillage" />
      <int name="swim" value="0" />
      <int name="fieldLimit" value="8260" />
      <int name="VRTop" value="-892" />
      <int name="VRLeft" value="-1064" />
      <int name="VRBottom" value="915" />
      <int name="VRRight" value="1334" />
      <int name="fly" value="0" />
      <int name="noMapCmd" value="0" />
      <string name="onFirstUserEnter" value="" />
      <string name="onUserEnter" value="go10000" />
      <int name="standAlone" value="0" />
      <int name="partyStandAlone" value="0" />
      <string name="fieldScript" value="" />
   </imgdir>

   </imgdir>
   <imgdir name="portal">
      <imgdir name="0">
         <string name="pn" value="sp" />
         <int name="pt" value="0" />
         <int name="x" value="-389" />
         <int name="y" value="183" />
         <int name="tm" value="999999999" />
         <string name="tn" value="" />
      </imgdir>
      <imgdir name="1">
         <string name="pn" value="sp" />
         <int name="pt" value="0" />
         <int name="x" value="-416" />
         <int name="y" value="185" />
         <int name="tm" value="999999999" />
         <string name="tn" value="" />
      </imgdir>
      <imgdir name="2">
         <string name="pn" value="sp" />
         <int name="pt" value="0" />
         <int name="x" value="-450" />
         <int name="y" value="183" />
         <int name="tm" value="999999999" />
         <string name="tn" value="" />
      </imgdir>
      <imgdir name="3">
         <string name="pn" value="out00" />
         <int name="pt" value="2" />
         <int name="x" value="1080" />
         <int name="y" value="541" />
         <int name="tm" value="20000" />
         <string name="tn" value="in00" />
         <string name="script" value="" />
         <int name="hideTooltip" value="0" />
         <int name="onlyOnce" value="0" />
         <int name="delay" value="0" />
      </imgdir>
   </imgdir>

批处理文件不起作用;正如你在我的另一个帖子中看到的那样:Batch script not working?

我需要一个C#应用程序来打开每个XML文件,获取特定信息(我将在下面指定),将该信息写入单个文本文件,然后冲洗并重复,直到每个XML文件都被读取。

使用上面发布的XML文件片段/实际XML文件信息,以下是我需要文本文件文本结构的方法;

[10000]
total=4
sp 0 -389 183 999999999
sp 0 -416 185 999999999
sp 0 -450 183 999999999
out00 2 1080 541 20000

我无法解决如何在c#控制台应用程序中执行此操作。

我正在寻求帮助,感激不尽!

2 个答案:

答案 0 :(得分:2)

string[] files = Directory.GetFiles(@"SomeWhere");
List<string> result = new List<string>();

foreach (string file in files)
{
    string[] lines = File.ReadAllLines(file);

    // Grab information from the lines and store it in result
    // by using result.Add(...) or result.AddRange(...)
}

File.WriteAllLines(@"AlsoSomewhere", result);

答案 1 :(得分:2)

这是我编写的一个快速而肮脏的程序。我不得不在你的XML文件中添加一个root,以便它与程序一起玩得很好。我希望这有帮助!

代码:

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

namespace ConsoleApp5 {
    public class Program {
        public static void Main(string[] args) {

            string test = getValuesOneFile("xmltest.xml");

            Console.WriteLine(test);
            Console.ReadLine();

        }

        public static string getValuesOneFile(string fileName) {

            string finalString = "";

            XElement xmlDocument = XElement.Load((fileName));

            XElement infoImgDir = GetImgDir(xmlDocument, "info");

            finalString += "[" + GetInt(infoImgDir, "returnMap") + "]\n";

            finalString += "total=" + GetChildrenCount(GetImgDir(xmlDocument,"portal")) + "\n";

            IEnumerable<XElement> portals = GetImgDir(xmlDocument, "portal").Elements();

            foreach (XElement currentPortal in portals) {
                finalString += GetString(currentPortal, "pn") + " ";
                finalString += GetInt(currentPortal, "pt") + " ";
                finalString += GetInt(currentPortal, "x") + " ";
                finalString += GetInt(currentPortal, "y") + " ";
                finalString += GetInt(currentPortal, "tm") + "\n";
            }

            return finalString;
        }

        public static XElement GetImgDir(XElement file, string imgDirName) {
            return file.Descendants("imgdir").FirstOrDefault(x => (string)x.Attribute("name") == imgDirName);

        }

        public static int GetInt(XElement data, string attribName) {
            var element = data.Descendants("int").FirstOrDefault(x => (string)x.Attribute("name") == attribName);

            if (element == null)
                return 0;

            var value = (int?)element.Attribute("value");

            if (value == null)
                return 0;

            return value.Value;
        }

        public static string GetString(XElement data, string attribName) {
            var element = data.Descendants("string").FirstOrDefault(x => (string)x.Attribute("name") == attribName);

            if (element == null)
                return "";

            var value = (string)element.Attribute("value");

            if (value == null)
                return "";

            return value;
        }

        public static int GetChildrenCount(XElement data) {
            return data.Elements().Count();
        }
    }
}