<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
}`
但我不知道如何将值放入列表中以便我可以读取它,提取数据并使用它。有人可以帮忙吗?
答案 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开始,因为我正在避开第一个条目,即图像列表的名称。
如果我做错了,请纠正我。我还在学习。