Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# 使用Linq from XML聚合倍数_C#_Xml_Linq - Fatal编程技术网

C# 使用Linq from XML聚合倍数

C# 使用Linq from XML聚合倍数,c#,xml,linq,C#,Xml,Linq,我遇到的问题是读取XML文件并拉取多段的WGT。希望提取属性以及元素值 下面是我遇到的问题 Pieces = el.Element("PIECE_WGT").Attribute("CNT").Value, Weight = el.Element("PIECE_WGT").Value 下面是我所有的代码 class FILELOGElements { public string FileNo { get; set; } public string TotPieces { get;

我遇到的问题是读取XML文件并拉取多段的WGT。希望提取属性以及元素值

下面是我遇到的问题

Pieces = el.Element("PIECE_WGT").Attribute("CNT").Value,
Weight = el.Element("PIECE_WGT").Value
下面是我所有的代码

class FILELOGElements
{
    public string FileNo { get; set; }
    public string TotPieces { get; set; }
    public string TotWeight { get; set; }
    public string PiecesUsed { get; set; }
    public double Pieces { get; set; }
    public double Weight { get; set; }
}

private IEnumerable<FILELOGElements> FileInfo(XElement doc, string FileNo)
{
    IEnumerable <FILELOGElements> Info = 
        from el in doc.Elements("FILE_NO")
        where el.Attribute("ID").Value.ToUpper() == FileNo
        select new FILELOGElements
        {
            FileNo = el.Attribute("ID").Value.ToUpper(),
            TotPieces = el.Element("TOTAL_PIECES").Value.ToUpper(),
            TotWeight = el.Element("TOTAL_WEIGHT").Value.ToUpper(),
            PiecesUsed = el.Element("PIECES_USED").Value.ToUpper(),
            Pieces = el.Element("PIECE_WGT").Attribute("CNT").Value,
            Weight = el.Element("PIECE_WGT").Value
        };

    return Info;
}
类FILELOGElements
{
公共字符串FileNo{get;set;}
公共字符串TotPieces{get;set;}
公共字符串总权重{get;set;}
使用的公共字符串片段{get;set;}
公共双件{get;set;}
公共双权重{get;set;}
}
私有IEnumerable文件信息(XElement文档,字符串文件号)
{
IEnumerable信息=
从文件元素中的el(“文件编号”)
其中el.Attribute(“ID”).Value.ToUpper()==FileNo
选择新的FILELOGElements
{
FileNo=el.Attribute(“ID”).Value.ToUpper(),
TotPieces=el.Element(“TOTAL_PIECES”).Value.ToUpper(),
TotWeight=el.Element(“总重量”).Value.ToUpper(),
PiecesUsed=el.Element(“PIECES_USED”).Value.ToUpper(),
工件=el.元素(“工件”)属性(“CNT”)值,
重量=el.元素(“工件重量”)值
};
退货信息;
}
以下是XML文档的设置方式:

<INFO>
  <FILE_NO ID="2150510370">
    <TOTAL_PIECES>2</TOTAL_PIECES>
    <TOTAL_WEIGHT>500</TOTAL_WEIGHT>
    <PIECES_USED>2</PIECES_USED>
    <PIECE_WGT CNT="1">100</PIECE_WGT>
    <PIECE_WGT CNT="2">125</PIECE_WGT>
  </FILE_NO>
  <FILE_NO ID="2150510371">
    <TOTAL_PIECES>10</TOTAL_PIECES>
    <TOTAL_WEIGHT>1000</TOTAL_WEIGHT>
    <PIECES_USED>3</PIECES_USED>
    <PIECE_WGT CNT="1">100</PIECE_WGT>
    <PIECE_WGT CNT="2">125</PIECE_WGT>
    <PIECE_WGT CNT="3">275</PIECE_WGT>
  </FILE_NO>
</INFO>

2.
500
2.
100
125
10
1000
3.
100
125
275

不确定这是不是正确的方法,但这是我设法让它工作的方法

我将片段和权重转换为一个列表,这样我就可以为每个文件编号提取所有片段属性和元素

    private IEnumerable<FILELOGElements> FileInfo(XElement doc, string FileNo)
    {

        IEnumerable <FILELOGElements> Info = from el in doc.Elements("FILE_NO")
                                          where el.Attribute("ID").Value.ToUpper() == FileNo
                                          select new FILELOGElements
                                          {
                                              FileNo = el.Attribute("ID").Value.ToUpper(),
                                              TotPieces = Convert.ToDouble(el.Element("TOTAL_PIECES").Value),
                                              TotWeight = Convert.ToDouble(el.Element("TOTAL_WEIGHT").Value),
                                              PiecesUsed = Convert.ToDouble(el.Element("PIECES_USED").Value),
                                              Pieces = el.Elements("PIECE_WGT").Attributes("CNT").Select(a => Convert.ToDouble(a.Value)).ToList(),
                                              Weight = el.Elements("PIECE_WGT").Select(a => Convert.ToDouble(a.Value)).ToList()
                                          };



        return Info;
    }

}

class FILELOGElements
{
    public string FileNo { get; set; }
    public double TotPieces { get; set; }
    public double TotWeight { get; set; }
    public double PiecesUsed { get; set; }
    public List<double> Pieces { get; set; }
    public List<double> Weight { get; set; }


}
private IEnumerable文件信息(XElement文档,字符串文件号)
{
IEnumerable Info=来自文档元素中的el(“文件号”)
其中el.Attribute(“ID”).Value.ToUpper()==FileNo
选择新的FILELOGElements
{
FileNo=el.Attribute(“ID”).Value.ToUpper(),
TotPieces=转换为ToDouble(el.元素(“总件”)值),
TotWeight=换算为ToDouble(el.元素(“总重量”).值),
PiecesUsed=Convert.ToDouble(el.Element(“使用的片段”).Value),
Pieces=el.Elements(“PIECE_WGT”).Attributes(“CNT”).Select(a=>Convert.ToDouble(a.Value)).ToList(),
权重=el.Elements(“PIECE_WGT”)。选择(a=>Convert.ToDouble(a.Value)).ToList()
};
退货信息;
}
}
类FILELOGElements
{
公共字符串FileNo{get;set;}
公共双TotPieces{get;set;}
公共双权重{get;set;}
公共双段使用{get;set;}
公共列表项{get;set;}
公共列表权重{get;set;}
}

您还没有说出什么问题。大概问题是值是字符串,而属性是
double
——因此我建议将
XAttribute
XElement
转换为
double
,而不是使用
属性来使用自定义转换。。。但是您应该真正编辑代码以开始错误。还请注意,您所说的“有问题”的代码没有出现在更完整的代码中-您在代码段中调用的是
Count()
属性,而不是在方法本身中。。。请发一封邮件,以便帮助您。我将件数和重量更改为字符串。这有助于解决问题。我需要的是能够为文件提取所有工件的实例。没有选定的示例:如果用户选择文件号2155010371,我需要能够返回工件CTN=1、工件WGT=2、工件WGT=3。是否要计算总重量和总计数?不,需要向用户显示有10个工件,只有3个已经使用过,这里是每件用过的东西的重量“我把这些东西和重量改成了绳子”-这根本不是我的建议,这是一个非常糟糕的主意。这些不是逻辑上的字符串,是吗?“foo”的重量是什么意思?我已经解释了如何将值转换为所需的类型。。。但现在你基本上改变了你的要求。这不是堆栈溢出的工作原理——很明显,在每篇文章中,你只会问一个问题。