Что мне нужно сделать, чтобы мой стек правильно сохранял строку с указанными c символами в ней? - PullRequest
0 голосов
/ 07 марта 2020

Моя программа (в Unity и C#) принимает в файле Mathml уравнение, которое выглядит следующим образом:

<mrow>
<apply>
  <eq/>
  <apply>
    <plus/>
    <apply>
      <power/>
      <ci>5</ci>
      <cn>2</cn>
    </apply>
    <apply>
      <times/>
      <cn>4</cn>
      <ci>2</ci>
    </apply>
    <cn>4</cn>
  </apply>
  <cn>0</cn>
</apply>
</mrow>

Затем она анализирует содержимое этого файла и использует переключатель регистр для возврата указанных c значений. Мой файл чтения не читает в файле правильно, и я знаю, что я читаю его, потому что он выводит "UnityEngine.Debug: Log (Object)", но ничего из файла. Я думал, что это может быть чтение пустых мест и не игнорирование их, но я думал, что регистр переключателя будет только читать строку для тега, а затем возвращать указанную c строку. Я не уверен, почему я не могу вывести правильное содержимое, которое я хочу, например, операторы. Этот код ниже:


using UnityEngine;
using librarytags;
using System.Collections.Generic;

public class ParseML : Librarymathml
{
    Stack<string> applies = new Stack<string>();

    public void Start()
    {
        //var textFile = Resources.Load<TextAsset>("MathMLBase/testing");

        OpenFileReader();
        //ToOutput();
    }

    public void OpenFileReader()
    {
        int counter = 0;
        string line;

        System.IO.StreamReader file =
        new System.IO.StreamReader(@"c:\Users\MckyW\Documents\attempting\Assets\Resources\Algorithm.xml");     // Path to the algorithm
        while ((line = file.ReadLine()) != null)        // Read all the lines of the file
        {                                               // On every line, scan for a tag and use the tag library to store tags in a stack
            string tempLine = MLTAGS(line);             // Only scans and stores tags
            applies.Push(tempLine);
            Debug.Log(tempLine);
            counter++;
        }
        file.Close();
    }

    public void ToOutput()
    {
        foreach(string str in applies)
        {
            string stack = applies.Pop();
            Debug.Log(stack);
        }
    }
}

Переключатель:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace librarytags
{
    public class Librarymathml : MonoBehaviour
    {

        public static string MLTAGS(string tag)
        {

            switch (tag)
            {
                case "<math>":
                    //
                    return "";
                case "</math>":
                    //
                    return "";
                case "<mrow>":
                    //
                    return "";
                case "</mrow>":
                    //
                    return "";
                case "<apply>":
                    // 
                    return "";
                case "</apply>":
                    //
                    return "";
                case "<eq/>":

                    return "=";
                case "<plus/>":

                    return "+";
                case "<ci>":

                    return "";
                case "</ci>":

                    return "";
                case "<cn>":

                    return "";
                case "</cn>":

                    return "";
                case "<times/>":

                    return "*";
                case "<power>":

                    return "^";
                case "</power>":

                    return "";
              /*  case number:

                    return numatthatline*/
                case "":

                    return "";
            }
            return "";
        }
    }
}

1 Ответ

0 голосов
/ 07 марта 2020

Вы можете просто использовать XmlReader вместо попытки его анализа вручную.

string path = @"c:\Users\MckyW\Documents\attempting\Assets\Resources\Algorithm.xml";
using(Stream stream = File.OpenRead(path))
{
    XmlReader reader = XmlReader.Create(stream);
    while (reader.Read())
    {
       // Do your parsing here
    }
}

Обратите внимание, что метод XmlReader.Read() заставляет экземпляр читателя двигаться вперед, а затем давайте Вы изучаете информацию о том, что было прочитано. Он возвращает false, если достигает конца файла, поэтому вы никогда не столкнетесь с бесконечным l oop.
. Вы можете получить NodeType, который является основной информацией о том, как вы должны обращаться с прочитанными данными ( является ли это элементом, конечным элементом, содержимым, пробелами и т. д. c.), а затем переходите к синтаксическому анализу этого конкретного элемента.
Имя тега можно получить с помощью свойства Name или значения для чтения. между тегами, используя свойство Value. Вам также следует проверить, является ли узел пустым элементом, чтобы не сталкиваться с проблемами при попытке поиска несуществующего закрывающего тега.

...