【问题标题】:Unable to Parse XML using LINQ in ASP.Net & C#无法在 ASP.Net 和 C# 中使用 LINQ 解析 XML
【发布时间】:2013-09-25 15:18:14
【问题描述】:

我的 XML:

<?xml version="1.0" encoding="utf-8"?>
<Horizon-Export>
  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:41:08 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>
  </UltimateForce>
  <UltimateStress>
  </UltimateStress>
  <Remarks>Pass</Remarks>
  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:47:10 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>25.3</UltimateForce>
  <UltimateStress>1.12</UltimateStress>
  <Remarks>Pass</Remarks>
  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:48:57 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>8.3</UltimateForce>
  <UltimateStress>0.37</UltimateStress>
  <Remarks>Pass</Remarks>
  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:49:20 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>10.9</UltimateForce>
  <UltimateStress>0.49</UltimateStress>
  <Remarks>Pass</Remarks>
  <BatchNo.>1</BatchNo.>
  <SpecimenID>CL1</SpecimenID>
  <OperatorName>Anuj</OperatorName>
  <SpecimenAge>1.00</SpecimenAge>
  <Grade>M12</Grade>
  <DateofCasting>01/09/2012</DateofCasting>
  <SpecimenShape>Cube</SpecimenShape>
  <SpecimenSize>150.00</SpecimenSize>
  <Area>22,500</Area>
  <Weight>10.0</Weight>
  <Density>1.00</Density>
  <TestDate>17/09/2012</TestDate>
  <TestTime>9:49:42 AM</TestTime>
  <BatchDate>17/09/2012</BatchDate>
  <UltimateForce>2.6</UltimateForce>
  <UltimateStress>0.12</UltimateStress>
  <Remarks>Pass</Remarks>
</Horizon-Export>

我的客服:

private List<CubeTestDTL> ParseXMLToList()
    {
        List<CubeTestDTL> cubeTestDetailList = new List<CubeTestDTL>();
        if (fuImport.HasFile)
        {
            if (fuImport.PostedFile.ContentLength > 0)
            {
                var name = string.Format("{0}.xml", Guid.NewGuid().ToString().Replace("-", string.Empty));
                var filePath  = string.Format("~/Temp/{0}",name);
                fuImport.SaveAs(Server.MapPath(filePath));
                cubeTestDetailList =
                (
                    from e in XDocument.Load(Server.MapPath(string.Format("~/Temp/{0}",name))).Root.Elements("Horizon-Export")
                    select new CubeTestDTL
                    {
                        Srlno = (int)e.Element("BatchNo."),
                        Accd = Session["ACCD"].ToString(),
                        AvgCompStrength = 0,
                        BreakingLoad = (double)e.Element("UltimateForce"),
                        CompStrength = (double)e.Element("UltimateStress"),
                        CubeArea = (double)e.Element("Area"),
                        CubeDensity = (double)e.Element("Density"),
                        CubeNo = (string)e.Element("SpecimenID"),
                        CubeWeight = (double)e.Element("Weight"),
                        CustDate = (DateTime)e.Element("DateofCasting"),
                        Grade = (string)e.Element("Grade"),
                        Location = (string)e.Element("OperatorName"),
                        MainAccd =Session["MAINACCD"].ToString(),
                        TargetStrength = 0,
                        TestOn = (double)e.Element("TestDate"),

                    }).ToList<CubeTestDTL>();


            }
        }
        return cubeTestDetailList;

    }

问题:

每次解析返回我 0 个项目。我无法调试,因为整个 linq 块一次通过。列表计数始终显示 =0。

【问题讨论】:

  • 那你为什么不把它分开呢?不要使用LINQ,只需将相同的代码放入标准foreach
  • @Arran 使用 foreach 的任何参考代码或链接

标签: c# asp.net xml linq


【解决方案1】:

从表达式中得不到任何结果是正常的:

from e in (LoadXmlStuff()).Root.Elements("Horizon-Export")

因为在您的 XML &lt;Horizon-Export&gt; 的情况下,根,而不是根的后代。

这也意味着 XML 中不能有多个 &lt;Horizon-Export&gt; 标签,因为 XML 只能有一个根。拥有更多标签的唯一可能性是将它们包装在另一个标签中,然后该标签将成为根。

【讨论】:

  • (double) e.Element("Area")实际上是LINQ to XML中的合法语法,并且比double.Parse(e.Element("Area").Value)安全,因为如果元素不存在,第一种方式会返回null,第二种方式会抛出异常如果元素不存在。更好的办法是将其转换为字符串,然后使用double.TryParse
【解决方案2】:

你尝试过切换

.Root.Elements("Horizon-Export")

.Descendants("Horizon-Export")

?虽然我不使用 linq 来查询 XML,但我更喜欢使用 foreach 方式,所以这是我的第一个猜测。

【讨论】:

  • 它给了我对象引用异常
  • 我也会担心你正在做的类型转换。您正在对 Double 元素 UltimateForce 进行类型转换,在第一种情况下为 null,这也会导致异常。此外,我不确定您要使用代码完成什么,因为您只会使用您编写的名称的第一个元素。并添加 .Value,因为您正在获取元素值,而不是元素本身。
猜你喜欢
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多