Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xml填充数据表_C#_Xml_Linq_Xaml - Fatal编程技术网

C# 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;

我正在从给定的xml文件创建一个DataTable。我看过其他资源和类似的问题,但仍然停留在同一个地方。我想根据xml输入文件填充一个表,使其看起来像这样:

我已经正确插入了数据列,行数基于
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){}
部分替换为simply
Console.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."
                    );
        }