为了账号安全,请及时绑定邮箱和手机立即绑定

XML 填充数据表

XML 填充数据表

C#
梵蒂冈之花 2022-01-16 10:37:49
我正在从给定的 xml 文件创建一个 DataTable。我查看了其他资源和类似的问题,但仍然卡在同一个地方。我想根据我的 xml 输入文件填充一个表,使其看起来像这样:表输出我已经到了正确插入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();            }        }    }    
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

尝试 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")

                });

            }

        }

    }

}


查看完整回答
反对 回复 2022-01-16
?
喵喵时光机

TA贡献1846条经验 获得超7个赞

根据 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 值的输入(或缺少输入)如何,表列都将正确设置为默认值。由于 col_no 是唯一重要且可靠的信息,因此这也可以解决列乱序问题。


查看完整回答
反对 回复 2022-01-16
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

您可以像这样使用 DataSet 解决您的问题(这不是一个漂亮的解决方案,但它有效;):


 static void Main(string[] args)

    {

        DataTable dt = new DataTable("Items");

        string xmlFile = @"new.xml";


        DataSet ds = new DataSet();

        ds.ReadXml(xmlFile);


        foreach (DataRow rowCol in ds.Tables["bomcol"].Rows)

        {

            dt.Columns.Add(rowCol.ItemArray[2].ToString());

        }


        DataRow dr = dt.Rows.Add();

        for (int j = 0; j < ds.Tables["bomcell"].Rows.Count; j++)

        {


            var i = j % 5;

            if (i == 0 && j != 0)

            {

                dr = dt.Rows.Add();

            }


            dr[dt.Columns[i]] = ds.Tables["bomcell"].Rows[j].ItemArray[1];

        }


        Console.WriteLine("Rows: " + dt.Rows.Count);

        Console.WriteLine("Cols: " + dt.Columns.Count);

        DataColumnCollection cols = dt.Columns;

        foreach (DataColumn col in cols)

        {

            Console.Write(cols[0] + "\t");

        }


        foreach (DataRow row in dt.Rows)

        {

            Console.WriteLine();

            Console.Write(row.ItemArray[0] + "\t\t" + row.ItemArray[1] + "\t\t" + row.ItemArray[2] + "\t\t" + row.ItemArray[3] + "\t\t" + row.ItemArray[4] + "\t");

        }


        Console.ReadLine();

    }


查看完整回答
反对 回复 2022-01-16
  • 3 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信