winforms 如何基于在另一个XML文件中找到的复杂架构在C# Visual Studio中解析XML文件?

cgvd09ve  于 2023-03-03  发布在  C#
关注(0)|答案(1)|浏览(113)

我正在创建一个程序来帮助游戏玩家/程序员设计技术树。我使用Visual Studio和C#。技术树的架构存储在XML文件中。此XML文件可能具有复杂的结构,包含嵌套元素。我需要能够读取架构并基于架构中可用的字段,将另一个XML文件加载到窗体中。我正在使用DataGridView元素。我最初的计划是加载架构,然后迭代每个元素以设计Windows窗体。大部分元素将显示在主DataGridView中,并且具有子元素的元素将在右侧面板中具有较小的DataGridView,该面板将在其自己的DataGridView中显示每个这样的元素。
它应该是这样的:

在此示例图像中,我手动创建了3个DataGridView元素,并尝试使用以下代码填充它们:

private void frmDesigner_Load(object sender, EventArgs e)
    {
        dsMainTech.ReadXml("CIV4TechInfos.xml");

        dgvTechnologies.DataSource = dsMainTech.Tables["TechInfo"];
        dgvTechnologies.AutoResizeColumns();

        dgvFlavors.DataSource = dsMainTech.Tables["TechInfo"];
        dgvFlavors.DataMember = "TechInfo_Flavors";

        dgvOrPrereqs.DataSource = dsMainTech.Tables["TechInfo"];
        dgvOrPrereqs.DataMember = "TechInfo_OrPreReqs";

        dgvAndPrereqs.DataSource = dsMainTech.Tables["TechInfo"];
        dgvAndPrereqs.DataMember = "TechInfo_AndPreReqs";
    }

正如您所看到的,主TechInfo被加载到dgvTechnologies DataGridView中,但是右侧的那些没有被填充。
我还尝试使用此代码填充子DataGridView:

dgvFlavors.DataSource = dsMainTech;
        dgvFlavors.DataMember = "Flavor";

        dgvOrPrereqs.DataSource = dsMainTech;
        dgvOrPrereqs.DataMember = "OrPreReqs";

        dgvAndPrereqs.DataSource = dsMainTech;
        dgvAndPrereqs.DataMember = "AndPreReqs";

但这对先决条件不起作用,Flavors全部一起运行,将它们组合在一起,而不是只显示与左侧所选行相关联的Flavors(这是我希望发生的)。

希望有人能理解我正在尝试做什么,如果有人以前做过这种类型的事情,请让我知道如何正确加载这些。同样,最初的目标是使用模式文件来告诉哪些元素要创建子DataGridView,但现在我会满足于以可读和(希望)可编辑的方式加载XML的任何方法,如DataGridView。
下面是一个可以使用的XML文件示例:
https://github.com/f1rpo/AdvCiv/blob/master/Assets/XML/Technologies/CIV4TechInfos.xml
下面是相应的Schema文件:
https://github.com/f1rpo/AdvCiv/blob/master/Assets/XML/Technologies/CIV4TechnologiesSchema.xml

zpf6vheq

zpf6vheq1#

我不能完全按照我想要的方式来做。我不能解析Schema文件,因为它非常复杂。相反,我选择了更“固定”的方法,使用我希望在Tech文件中找到的字段。
我首先将Tech文件读入数据源,然后用适当的Table填充DataGridView:

dsMainTech.ReadXml(loadtech);

dgvTechnologies.DataSource = dsMainTech.Tables["TechInfo"];

接下来,我将同一个文件读入一个XDocument,并将其解析为一个XElement列表:

XDocument xDocument = XDocument.Load(loadtech);
List<XElement> xElementList = xDocument.Elements().ToList();

之后,我循环浏览了元素:

foreach (XElement element in xElementList)
        {

然后查找与我正在查找的已知类型相匹配的字段,我使用switch语句解析文件的元素,并将关键信息存储在我创建的附加列表中:

allTechs = new List<string>();
allTechBasics = new Dictionary<string, TechBasics>();

TechBasics是我创建的一个类,用于跟踪重要信息,如技术树上的X和Y位置以及先决条件技术。
正如我所说,这不是我最初想要的,但它现在运行得很好,我在设计技术树的可视化表示方面取得了很大进展。

相关问题