我对 Unity 和 C# 比较陌生。其实我主要是看应用程序代码,尝试学习一点。这很有趣。
现在我偶然发现了一个问题。
我正在尝试读取 XML 文件并继续使用其中的数据。这甚至有效。但现在我不想使用 XML 文件的所有记录,而只想使用那些具有特定 ID 的记录。
目前我这样做:
public class Data
{
public frage[] fragen = new frage[0];
public Data () { }
public static void Write(Data data)
{
XmlSerializer serializer = new XmlSerializer(typeof(Data));
using (Stream stream = new FileStream (GameUtility.XmlFilePath, FileMode.Create))
{
serializer.Serialize(stream, data);
}
}
public static Data Fetch ()
{
return Fetch(out bool result);
}
public static Data Fetch(out bool result)
{
if (!File.Exists(GameUtility.XmlFilePath)) { result = false; return new Data(); }
XmlSerializer deserializer = new XmlSerializer(typeof(Data));
using (Stream stream = new FileStream(GameUtility.XmlFilePath, FileMode.Open))
{
var data = (Data)deserializer.Deserialize(stream);
result = true;
return data;
}
}
}
我认为这会导致所有数据都存储在相应的变量(数据)中。但现在我只想传输那些 ID 为 5 的数据集。这可以通过简单的调整实现吗?还是我必须考虑所有事情?
我的数据集是通过 XML 创建的,如下所示:
<?xml version="1.0"?>
<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<fragen>
<frage>
<info>IRGENDEINTEXT1</info>
<antworten>
<antwort>
<info>1</info>
<korrekt>true</korrekt>
</antwort>
<antwort>
<info>2</info>
<korrekt>false</korrekt>
</antwort>
<antwort>
<info>3</info>
<korrekt>false</korrekt>
</antwort>
<antwort>
<info>4</info>
<korrekt>false</korrekt>
</antwort>
</antworten>
<id>5</id>
</frage>
<frage>
<info>IRGENDEINTEXT2</info>
<antworten>
<antwort>
<info>1</info>
<korrekt>false</korrekt>
</antwort>
<antwort>
<info>2</info>
<korrekt>false</korrekt>
</antwort>
<antwort>
<info>3</info>
<korrekt>false</korrekt>
</antwort>
<antwort>
<info>4</info>
<korrekt>true</korrekt>
</antwort>
</antworten>
<id>7</id>
</frage>
</fragen>
</Data>
谢谢 - 我希望我的问题有意义并且不太不清楚。请原谅我不正确的英语。
最佳答案
你可以这样做,但我建议不要一直只读取部分文件,因为这是一个持续的 IO 命中。每次您需要获取新问题时,您都会在磁盘上获得另一个读取 IO。除非您的问题集很大(例如数百 MB),否则您可以在游戏开始时将所有数据读入您的 Data
对象,然后只需在您的 Data
中添加一个辅助函数为您提供相关信息的类。例如
class Data {
private Frage[] fragen;
// Read a Frage by ID
public Frage QuestionById(string id) {
return this.fragen.First(it => it.id == id);
}
}
答案相同:
class Frage {
private Antwort[] antworten;
public Antwort GetCorrectAnswer() {
return antworten.First(it => it.korrekt);
}
}
然后在你的游戏逻辑中你可以调用:
var aFrage = data.QuestionById("4711");
var anAntwort = aFrage.GetCorrectAnswer();
理论上,您也可以使用 XPath 来选择您需要的 XML 节点,但是要实现这一点,您仍然需要将整个 XML 文档加载到内存中,以便在其上运行您的 XPath(我不知道有任何.net 的 XPath 实现可在流上运行)。因此,您也可以像我所布置的那样使用您自己的数据结构。
如果您确实需要一个巨大的数据集并且无法将所有内容加载到内存中,那么您可能应该考虑一些数据库解决方案,例如SQLite 来存储您的数据。这将允许您执行 SQL DB 查询,并且不需要您将所有数据加载到内存中。
关于c# - 仅使用 xml 文件的部分内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59734332/