逐行读取xml文件并添加到列表中

时间:2017-12-10 18:33:42

标签: c# xml

<SubTexture name="explosion0000.png" x="180" y="474" width="24" height="25"/>
<SubTexture name="explosion0001.png" x="422" y="609" width="30" height="30"/>
<SubTexture name="explosion0002.png" x="395" y="981" width="34" height="34"/>
<SubTexture name="explosion0003.png" x="354" y="981" width="39" height="39"/>

以上是XML文件的四行,我需要从中提取信息到列表中。我需要读取每一行并使用字符串和值来执行特定任务。为此,我使用代码

    {
        XmlReader xmlReader = XmlReader.Create("D:/C#/GameAssets/Images/alienExplode/images/alienExplode.xml");
        while (xmlReader.Read())
        {
            Console.Write(xmlReader.Name);
            while (xmlReader.MoveToNextAttribute()) // Read the attributes.
                Console.Write(" " + xmlReader.Name + " = '" + xmlReader.Value + "' ");
            Console.WriteLine(" ");
        }
        Console.ReadKey(); // wait for keyboard input to exit
    }`

但我不知道如何将值放入列表中以便我可以读取它,提取数据并使用它。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

快速解决方案(但有黑客......)

using System.Linq;
using System.Xml.Linq;

namespace ConsoleApp
{
    class Program
    {
        static void Main (string[] args)
        {
            var xml = @"<SubTexture name=""explosion0000.png"" x=""180"" y=""474"" width=""24"" height=""25""/>
                        <SubTexture name=""explosion0001.png"" x=""422"" y=""609"" width=""30"" height=""30""/>
                        <SubTexture name=""explosion0002.png"" x=""395"" y=""981"" width=""34"" height=""34""/>
                        <SubTexture name=""explosion0003.png"" x=""354"" y=""981"" width=""39"" height=""39""/>";

            var xElement = XElement.Parse ("<rootHack>" + xml + "</rootHack>"); // XElement requires root element, so we need to use a hack

            var list = xElement.Elements ().Select (element => new MyClass
            {
                Name   = element.Attribute ("name").Value,
                X      = int.Parse (element.Attribute ("x").Value),
                Y      = int.Parse (element.Attribute ("y").Value),
                Width  = int.Parse (element.Attribute ("width").Value),
                Height = int.Parse (element.Attribute ("height").Value),

            }).ToList ();
        }
    }

    class MyClass
    {
        public string Name;
        public int X, Y, Width, Height;

        public override string ToString () => $"{Name}, X={X} Y={Y}, W={Width} H={Height}";
    }
}

答案 1 :(得分:0)

我用下面的代码解决了上述问题。 使用的xml文件是here

using System;
using System.Collections.Generic;
using System.Xml;

namespace ReadXMLfromFile
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        static bool addToFile = false;
        static List<List<string>> imageData = new List<List<string>>();

        static void Main(string[] args)
        {

            XmlReader xmlReader = XmlReader.Create("D:/C#/GameAssets/Images/alienExplode/images/alienExplode.xml");
            while (xmlReader.Read())
            {
                List<string> tempData = new List<string>();

                while (xmlReader.MoveToNextAttribute())
                {
                    Console.Write(xmlReader.Value + " ");
                    tempData.Add(xmlReader.Value);
                    Console.WriteLine("-----------------------------> adding data to tempList " + tempData.Count);
                    //Console.ReadKey();
                    addToFile = true; // get ready to write


                }
                if (addToFile)
                {
                    Console.WriteLine("adding tempList to Mainlist");
                    imageData.Add(tempData);

                    Console.WriteLine("----------------------------> imagedata " + imageData.Count);

                    addToFile = false;

                }

            }
            Console.WriteLine(imageData.Count);

            for (int i = 1; i <= imageData.Count - 1; i++)
            {
                for (int x = 0; x < imageData[i].Count; x++)
                {
                    Console.WriteLine(imageData[i][x]);
                }
            }
            Console.ReadKey(); // wait for keyboard input to exit
        }
    }
}

可以逐行读取xml文件,如本例所示。这可能是因为除了第一个节点之外,这个特定文件的所有节点都采用相同的格式。

第一个for循环中的计数器从1开始,因为我正在避开第一个条目,即图像列表的名称。

如果我做错了,请纠正我。我还在学习。