【问题标题】:Unity / C# Cycle Through XML Data On Button PressUnity / C#在按钮按下时循环XML数据
【发布时间】:2019-01-06 06:42:24
【问题描述】:

我对编程和 Unity 还很陌生,我希望有人可以帮助指导我找到解决方案。

我有一个包含以下数据的 XML 文件。我想一次显示一个团队的统计数据,然后当用户单击一个按钮时,我希望脚本循环到 XML 文件中的下一个团队节点并显示该团队的信息。任何帮助将不胜感激!

<roster>
    <team>
            <id>0</id>
            <teamname>Atlanta Seagulls</teamname>
            <overall>90</overall>
            <offense>74</offense>
            <defense>98</defense>
    </team>

    <team>
            <id>1</id>
            <teamname>Minnesota Trees</teamname>
            <overall>68</overall>
            <offense>58</offense>
            <defense>73</defense>
    </team>

    <team>
            <id>2</id>
            <teamname>Denver Mountains</teamname>
            <overall>50</overall>
            <offense>39</offense>
            <defense>74</defense>
    </team>

这是我的 C# 脚本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Xml;
using UnityEngine.UI;
using System;
using System.Text;
using System.Xml;

public class LoadXML : MonoBehaviour {

    public TextAsset xmlRawFile;
    public Text uiText;
    public int nodeCount;
    public int index;
    public int teamId;
    public Text teamIdTest;

    // Use this for initialization
void Start () {
    string data = xmlRawFile.text;
    parseXmlFile (data);
}

void parseXmlFile(string xmlData)
{
    string totalVal = "";
    XmlDocument xmlDoc = new XmlDocument ();
    xmlDoc.Load (new StringReader (xmlData));
    string xmlPathPattern = "//roster/team";
    XmlNodeList myNodeList = xmlDoc.SelectNodes (xmlPathPattern);
    nodeCount = myNodeList.Count;



    for (int i = 0; i < nodeCount; i++) 
        {
            if (i == index) 
            {

                foreach (XmlNode node in myNodeList) 
                {
                    XmlNode id = node.FirstChild;
                    XmlNode teamname = id.NextSibling;
                    XmlNode overall = teamname.NextSibling;
                    XmlNode offense = overall.NextSibling;
                    XmlNode defense = offense.NextSibling;



                    teamIdTest.text = id.InnerXml;
                    teamId = Int32.Parse (id.InnerXml);

                if (teamId == i) 
                    {

                        totalVal = " Team Name: " + teamname.InnerXml + "\nOverall: " + overall.InnerXml + "\nOffense : " + offense.InnerXml + "\nNodes : " + nodeCount + "\n\n";
                        uiText.text = totalVal;
                    }
                }
            }
        }

}
public void Swap()
{
    if (index < nodeCount - 1) {
        index++;
    } else {
        index = 0;
    }
}

}

【问题讨论】:

    标签: c# xml visual-studio unity3d


    【解决方案1】:

    例如,您可以读取文件并将每个团队的值存储在 XmlNodes 数组中。此代码可以将节点列表转换为数组:

    XmlNode[] nodeArray = myNodeList.Cast<XmlNode>().ToArray();
    

    然后,当用户单击按钮时,您将从数组中选择下一个项目并执行您的操作:

    public void SwapNext()
    {
    //nodeArray and currentNodeIndex  should be private class variables so you can reach them from all class functions
    currentNodeIndex += 1 ;
    node = nodeArray[currentNodeIndex];
    XmlNode id = node.FirstChild;
    XmlNode teamname = id.NextSibling;
    XmlNode overall = teamname.NextSibling;
    XmlNode offense = overall.NextSibling;
    XmlNode defense = offense.NextSibling;
    
    teamIdTest.text = id.InnerXml;
    teamId = Int32.Parse (id.InnerXml);
    
    totalVal = $"Team Name: {teamname.InnerXml} Overall {overall.InnerXml} Offense : {offense.InnerXml} Nodes {nodeCount}";
    uiText.text = totalVal;
    

    您也可以像现在一样一次解析整个文件,并将团队值存储为某个类的对象,例如 Team 类,然后使用对象数组而不是 XmlNode。

    【讨论】:

    • 哦,哇,感谢您的超快速响应。让我试一试。我是相当初学者,所以我不能 100% 确定我会让它正常工作,但我会尝试。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2016-02-29
    • 2022-01-25
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多