Я работаю над созданием DataTable из заданного XML-файла. Я посмотрел на другие ресурсы и похожие вопросы, но все еще застрял в том же месте. Я хочу заполнить таблицу на основе моего входного XML-файла, чтобы он выглядел примерно так: ![Table output](https://i.stack.imgur.com/ruEPd.png)
Я получил его до того момента, когда я правильно вставляю DataColumns и нет. строк основаны на количестве row_no
Моя проблема возникает при попытке добавить значения из элементов в bomrow
Я не уверен, как бы я заполнил эти строки, я продолжаю получать только один столбец, либо разделенный в столбце разделы или ряды разделов. Вот мой код:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Xml;
using System.Xml.Linq;
class Program
{
static IEnumerable<XElement> headerLabels(string xmlFile)
{
using (XmlReader reader = XmlReader.Create(xmlFile))
{
reader.MoveToContent();
while (!reader.EOF)
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "bomcol")
{
XElement el = XElement.ReadFrom(reader) as XElement;
if (el != null)
yield return el;
}
else
reader.Read();
}
}
}
static IEnumerable<XElement> rowValues(string xmlFile)
{
using (XmlReader reader = XmlReader.Create(xmlFile))
{
reader.MoveToContent();
while (!reader.EOF)
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "bomcell")
{
XElement el = XElement.ReadFrom(reader) as XElement;
if (el != null)
yield return el;
}
else
reader.Read();
}
}
}
static IEnumerable<XElement> rowNums(string xmlFile)
{
using (XmlReader reader = XmlReader.Create(xmlFile))
{
reader.MoveToContent();
while (!reader.EOF)
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == "bomrow")
{
XElement el = XElement.ReadFrom(reader) as XElement;
if (el != null)
yield return el;
}
else
reader.Read();
}
}
}
static void Main(string[] args)
{
DataTable dt = new DataTable();
string xmlFile = @"new.xml";
for (int i = 0; i <= 4; i++)
{
IEnumerable<String> colHeaders =
from el in headerLabels(xmlFile)
where (int)el.Attribute("col_no") == i
select (String)el.Attribute("name");
foreach (String header in colHeaders)
{
dt.Columns.Add(header).ToString();
}
}
Console.WriteLine("Rows: " + dt.Rows.Count);
Console.WriteLine("Cols: " + dt.Columns.Count);
DataColumnCollection cols = dt.Columns;
foreach (DataColumn col in cols)
{
Console.Write(col.ColumnName + "\t");
}
Console.WriteLine();
IEnumerable<String> rows =
from el in rowNums(xmlFile)
where (int)el.Attribute("row_no") >= 0
select (String)el.Attribute("row_no");
foreach (String row_n in rows)
{
DataRow rws = dt.Rows.Add(); //.Add(DATA Values)
}
List<string> rowVals = new List<string>();
foreach (DataRow dtRow in dt.Rows)
{
}
Console.WriteLine("Rows: " + dt.Rows.Count);
Console.WriteLine("Cols: " + dt.Columns.Count);
Console.WriteLine();
Console.ReadLine();
}
}
Вот пример xml, который я использую:
<xml>
<transactions>
<transaction>
<bom>
<bomheader>
<bomcol alignment="center" col_no="0" name="ITEM NO."/>
<bomcol alignment="center" col_no="1" name="ITEMCODE"/>
<bomcol alignment="center" col_no="2" name="PARTNUMBER"/>
<bomcol alignment="center" col_no="3" name="DESCRIPTION"/>
<bomcol alignment="center" col_no="4" name=" QTY."/>
</bomheader>
<bomrow document_id="32" path="\PARTS" row_no="0">
<bomcell col_no="0" value="1"/>
<bomcell col_no="1" value="201"/>
<bomcell col_no="2" value="75"/>
<bomcell col_no="3" value="MEMBER"/>
<bomcell col_no="4" value="2"/>
</bomrow>
<bomrow document_id="35" path="\PARTS" row_no="1">
<bomcell col_no="0" value="2"/>
<bomcell col_no="1" value="205"/>
<bomcell col_no="2" value="75-LH"/>
<bomcell col_no="3" value="MEMBER LEFT HAND"/>
<bomcell col_no="4" value="1"/>
</bomrow>
<bomrow document_id="30" path="\PARTS" row_no="2">
<bomcell col_no="0" value="3"/>
<bomcell col_no="1" value="200"/>
<bomcell col_no="2" value="01AB"/>
<bomcell col_no="3" value="FRAME"/>
<bomcell col_no="4" value="1"/>
</bomrow>
</bom>
</transaction>
</transactions>
</xml>
Вся помощь (или ресурсы) приветствуется!