Как разобрать иерархический XML из листа Excel

Я пытаюсь проанализировать XML-файл, как указано ниже с C# и XmlTextWriter

Пример:

<ChessBoard>
<King>
    <Bishop>
        <Soldier/>
    </Bishop>
</King>
<Queen>
    <Tower/>
</Queen>
</ChessBoard>

из книги Excel, которая содержит один слайд для каждого элемента, а в первом столбце - список его дочерних элементов. Ссылка на пример рабочей книги Excel, если (когда) объяснение не прояснилось:): https://www.yousendit.com/download/TEhYc0x3NDQrV3h1a3NUQw

Я не знаю, сколько листов пользователь сделает или количество элементов / дочерних элементов заранее, поэтому анализ должен быть динамическим.

Если бы кто-то мог указать мне правильное направление, я был бы очень признателен. При необходимости я могу предоставить (нерабочий) код, который у меня есть, если кто-то захочет использовать его в качестве отправной точки.

Заранее спасибо!

РЕДАКТИРОВАТЬ - код пока

 Excel.Application xlApp;
        xlApp = new Excel.Application();
        Excel.Workbook xlWorkBook = null;
        Excel.Worksheet xlWorkSheet;
        Excel.Range range;
        try
        {

            string str = string.Empty;
            xlWorkBook = xlApp.Workbooks.Open(Excel_location + @"\Tree.xls",
             Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing);


            using (XmlTextWriter writer = new XmlTextWriter(@"Tree.xml", Encoding.UTF8))
            {

                int rCnt = 0;// rCnt = row count
                writer.WriteStartDocument();


                Excel.Sheets sheets = xlWorkBook.Worksheets;
                Excel.Range sheetrange = xlWorkSheet.UsedRange;

                List<Excel.Worksheet> Sheets = new List<Excel.Worksheet>();
                foreach (Excel.Worksheet s in xlWorkBook.Worksheets)
                {
                    Sheets.Add(s);
                }


                 bool first = true;
                 foreach (Excel.Worksheet s in Sheets)
                {
                    if (first)
                    {
                        first = false;
                    sheetrange = s.UsedRange;
                    writer.WriteStartElement(s.Name);
                    for (rCnt = 1; rCnt <= sheetrange.Rows.Count; rCnt++)
                    {
                        string root = (string)(sheetrange.Cells[rCnt, 1] as Excel.Range).Value2.ToString();
                        writer.WriteStartElement(root);
                        foreach (Excel.Worksheet childsheet in Sheets)
                        {
                            if (childsheet.Name == root)
                            {

                                Excel.Range childsheetrange = childsheet.UsedRange;
                                for (int crCnt = 1; crCnt <= childsheetrange.Rows.Count; crCnt++)
                                {
                                    str = (string)(childsheetrange.Cells[crCnt, 1] as Excel.Range).Value2.ToString();
                                    writer.WriteStartElement(str);
                                    foreach (Excel.Worksheet child2sheet in Sheets)
                                    {
                                        if (child2sheet.Name == str)
                                        {
                                            Excel.Range child2sheetrange = child2sheet.UsedRange;
                                            for (int ccrCnt = 1; ccrCnt <= child2sheetrange.Rows.Count; ccrCnt++)
                                            {
                                                string str2 = (string)(child2sheetrange.Cells[ccrCnt, 1] as Excel.Range).Value2.ToString();
                                                writer.WriteStartElement(str2);
                                                writer.WriteEndElement();
                                            }
                                        }
                                    }


                                    writer.WriteEndElement();
                                }


                            }
                        }
                        writer.WriteEndElement();
                    }
                    writer.WriteEndElement();
                }
                }


            }
            xlWorkBook.Close(false, Excel_location + @"\Tree.xls", null);
            xlApp.Quit();
        }


        catch (Exception)
        {
            xlWorkBook.Close(false, Excel_location + @"\Tree.xls", null);
            xlApp.Quit();
            throw;
        }

Очевидно, что приведенный выше код представляет собой "незначительную" проблему; когда есть более 2 дочерних элементов, эта вещь не будет работать:D Конечно, я мог бы добавить 25 циклов foreach, но я хотел бы иметь немного более сложное решение. Итак, как изменить код, чтобы он работал с произвольным числом дочерних элементов?

0 ответов

Другие вопросы по тегам