【问题标题】:Aggregate Multiples using Linq from XML使用来自 XML 的 Linq 聚合倍数
【发布时间】:2017-04-13 18:44:16
【问题描述】:

我遇到的问题是读取 XML 文件并提取多个 PIECE_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;
}

以下是 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>

【问题讨论】:

  • 你还没说怎么回事。大概问题是值是字符串,而您的属性是double - 所以我建议将XAttribute 或XElement 转换为double,而不是使用自定义转换,而不是使用Value属性...但是您应该真正编辑代码以启动错误。另请注意,您说您“遇到问题”的代码没有出现在更完整的代码中 - 您在 sn-p 中调用 Count() 属性,但不在方法本身中......请发布minimal reproducible example 让帮助您更轻松。
  • 我将件数和重量更改为字符串。这有助于它出错。我需要的是能够为选定的 FILE_NO 提取 PIECE_WGT 的所有实例示例:如果用户选择 FILE_NO 2150510371,我需要能够返回 PIECE_WGT CTN = 1、PIECE_WGT = 2、PIECE_WGT = 3
  • 您要计算总重量和总数量吗?
  • 不,需要向用户显示有10个,只用了3个,这里是每个用过的重量
  • “我将 Pieces 和 Weight 更改为 String”——这根本不是我的建议,而且是一个非常糟糕的主意。那些不是 logical 字符串,是吗? “foo”的重量是什么意思?我已经解释了如何将值转换为您需要的类型......但是现在您基本上已经改变了您的要求。这不是 Stack Overflow 的工作方式 - 你问 一个 问题,很明显,每个帖子。

标签: c# xml linq


【解决方案1】:

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

我将 Pieces 和 Weights 转换为一个列表,以便我可以提取每个文件编号的所有 PIECE_WGT 属性和元素

    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; }


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多