以下に示すように、C# と XmlTextWriter を使用して XML ファイルを解析しようとしています。
例:
<ChessBoard>
<King>
<Bishop>
<Soldier/>
</Bishop>
</King>
<Queen>
<Tower/>
</Queen>
</ChessBoard>
要素ごとに 1 つのスライドを含み、最初の列にその子要素のリストが含まれる 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 ループを追加できますが、もう少し洗練されたソリューションが必要です..では、任意の数で機能するようにコードを変更する方法子要素の?