c# - 仅使用 xml 文件的部分内容

标签 c# xml unity-game-engine serialization

我对 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/

相关文章:

c# - 如何从 Xml 文档中去除命名空间

C# WPF 如何拥有多个 DataContext

c# - POS协议(protocol)串口通讯

java - 为 Android 构建时,Unity 项目的 Gradle 构建失败

c# - 正确重置 Scene 并在 Unity 中保持得分

c# - Microsoft.ExceptionMessageBox 不是 "found"

xml - 修改部分XML元素名称并替换为增量编号

java - debug 未保存在 debug.log 下

xml - XSD 中的动态枚举

java - 如何从命令行重新编译jar文件