C# Xml填充数据表
我正在从给定的xml文件创建一个DataTable。我看过其他资源和类似的问题,但仍然停留在同一个地方。我想根据xml输入文件填充一个表,使其看起来像这样: 我已经正确插入了数据列,行数基于C# Xml填充数据表,c#,xml,linq,xaml,C#,Xml,Linq,Xaml,我正在从给定的xml文件创建一个DataTable。我看过其他资源和类似的问题,但仍然停留在同一个地方。我想根据xml输入文件填充一个表,使其看起来像这样: 我已经正确插入了数据列,行数基于row\u no的数量。我在尝试添加bomrow中元素的值时出现了问题,我不确定如何填充这些行,我一直只得到一个列,或者在列部分中分开,或者在行部分中分开。以下是我目前的代码: using System; using System.Collections.Generic; using System.Data;
row\u 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();
}
}
使用系统;
使用System.Collections.Generic;
使用系统数据;
使用System.Linq;
使用System.Xml;
使用System.Xml.Linq;
班级计划
{
静态IEnumerable头标签(字符串xmlFile)
{
使用(XmlReader=XmlReader.Create(xmlFile))
{
reader.MoveToContent();
而(!reader.EOF)
{
if(reader.NodeType==XmlNodeType.Element&&reader.Name==“bomcol”)
{
XElement el=XElement.ReadFrom(reader)作为XElement;
如果(el!=null)
收益率;
}
其他的
reader.Read();
}
}
}
静态IEnumerable行值(字符串xmlFile)
{
使用(XmlReader=XmlReader.Create(xmlFile))
{
reader.MoveToContent();
而(!reader.EOF)
{
if(reader.NodeType==XmlNodeType.Element&&reader.Name==“bomcell”)
{
XElement el=XElement.ReadFrom(reader)作为XElement;
如果(el!=null)
收益率;
}
其他的
reader.Read();
}
}
}
静态IEnumerable行数(字符串xmlFile)
{
使用(XmlReader=XmlReader.Create(xmlFile))
{
reader.MoveToContent();
而(!reader.EOF)
{
if(reader.NodeType==XmlNodeType.Element&&reader.Name==“bomrow”)
{
XElement el=XElement.ReadFrom(reader)作为XElement;
如果(el!=null)
收益率;
}
其他的
reader.Read();
}
}
}
静态void Main(字符串[]参数)
{
DataTable dt=新的DataTable();
字符串xmlFile=@“new.xml”;
对于(int i=0;i=0
选择(字符串)el.属性(“行号”);
foreach(行中的字符串行)
{
DataRow rws=dt.Rows.Add();//.Add(数据值)
}
List ROWVAL=新列表();
foreach(数据行中的数据行)
{
}
Console.WriteLine(“行:+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>
感谢所有帮助(或资源)!尝试xml linq:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("ITEM NO.", typeof(int));
dt.Columns.Add("ITEMCODE", typeof(string));
dt.Columns.Add("PARTNUMBER.", typeof(string));
dt.Columns.Add("DESCRIPTION", typeof(string));
dt.Columns.Add("QTY.", typeof(int));
XDocument doc = XDocument.Load(FILENAME);
foreach (XElement bomrow in doc.Descendants("bomrow"))
{
dt.Rows.Add(new object[] {
bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 0).FirstOrDefault() == null ?
null : (int?)bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 0).FirstOrDefault().Attribute("value"),
bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 1).FirstOrDefault() == null ?
null : (string)bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 1).FirstOrDefault().Attribute("value"),
bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 2).FirstOrDefault() == null ?
null : (string)bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 2).FirstOrDefault().Attribute("value"),
bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 3).FirstOrDefault() == null ?
null : (string)bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 3).FirstOrDefault().Attribute("value"),
bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 4).FirstOrDefault() == null ?
null : (int?)bomrow.Elements("bomcell").Where(x => (int)x.Attribute("col_no") == 4).FirstOrDefault().Attribute("value")
});
}
}
}
}
您可以像这样使用DataSet来解决问题(这不是一个漂亮的解决方案,但它很有效;):
static void Main(字符串[]args)
{
数据表dt=新数据表(“项目”);
字符串xmlFile=@“new.xml”;
数据集ds=新数据集();
ReadXml(xmlFile);
foreach(ds.Tables[“bomcol”].Rows中的DataRowCol)
{
Add(rowCol.ItemArray[2].ToString());
}
DataRow dr=dt.Rows.Add();
对于(int j=0;j
根据jdweng的回答构建:
foreach(XElement bomheader in doc.Descendants("bomheader"))
{
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 0).FirstOrDefault() == null ?
null : "ITEM NO."
);
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 1).FirstOrDefault() == null ?
null : "ITEMCODE"
);
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 2).FirstOrDefault() == null ?
null : "PARTNUMBER"
);
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 3).FirstOrDefault() == null ?
null : "DESCRIPTION"
);
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 4).FirstOrDefault() == null ?
null : "QTY."
);
}
这将确保无论bomcol值的输入(或缺少输入)如何,表列都将正确设置为默认值。由于列号是唯一重要和可靠的信息,因此这也可以解决列的无序问题。谢谢!我对使用LINQ相当陌生,您知道如果要处理缺少的值(例如,一行没有'itemcode')我必须给它分配FirstOrDefault()值?这也可以,虽然不是那么简单。但是,为了在这个解决方案中显示正确的列,您需要将
foreach(sols中的DataColumn col){}
部分替换为simplyConsole.Write(cols[0]+cols[1]+cols[2]+cols[3]+cols[4]);
因为我不希望您的第一列每次都重复,而是希望表中的每一列都重复
foreach(XElement bomheader in doc.Descendants("bomheader"))
{
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 0).FirstOrDefault() == null ?
null : "ITEM NO."
);
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 1).FirstOrDefault() == null ?
null : "ITEMCODE"
);
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 2).FirstOrDefault() == null ?
null : "PARTNUMBER"
);
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 3).FirstOrDefault() == null ?
null : "DESCRIPTION"
);
dt.Columns.Add(
bomheader.Elements("bomcol").Where(x => (int)x.Attribute("col_no") == 4).FirstOrDefault() == null ?
null : "QTY."
);
}