C# 当只有一个元素使用linq to xml时,返回整数数组

C# 当只有一个元素使用linq to xml时,返回整数数组,c#,linq,linq-to-xml,C#,Linq,Linq To Xml,我需要为只有一个值(xml格式)的选择返回一个数组,因为将使用数据的数据结构在其输入中需要一个整数数组(一个包含一个元素的数组) 这就是我的XML文件的样子 <rowset xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:saw-sql="urn:saw-sql" targetNamesp

我需要为只有一个值(xml格式)的选择返回一个数组,因为将使用数据的数据结构在其输入中需要一个整数数组(一个包含一个元素的数组)

这就是我的XML文件的样子

<rowset xmlns="urn:schemas-microsoft-com:xml-analysis:rowset">
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:saw-sql="urn:saw-sql" targetNamespace="urn:schemas-microsoft-com:xml-analysis:rowset">
    <xsd:complexType name="Row">
      <xsd:sequence>
        <xsd:element name="Column0" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula="&quot;F&amp;R Sales, Balances, Exposures and Limits&quot;.&quot;Financial Calendar&quot;.&quot;Month Year Short Name&quot;" saw-sql:displayFormula="&quot;Financial Calendar&quot;.&quot;Month Year Short Name&quot;" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="Financial Calendar" saw-sql:columnHeading="Month Year Short Name" saw-sql:isDoubleColumn="false" saw-sql:columnID="c29e370c0db340ad7" />
        <xsd:element name="Column1" type="xsd:string" minOccurs="0" maxOccurs="1" saw-sql:type="varchar" saw-sql:sqlFormula=" CASE WHEN &quot;F&amp;R Sales, Balances, Exposures and Limits&quot;.&quot;GRD Product Current&quot;.&quot;GRD Product Level 5 Name&quot; ='Bill financing' THEN 'Deposits' WHEN &quot;F&amp;R Sales, Balances, Exposures and Limits&quot;.&quot;GRD Product Current&quot;.&quot;GRD Product Level 5 Name&quot; IN ('Operating lease','Finance lease') THEN 'Lending' WHEN &quot;F&amp;R Sales, Balances, Exposures and Limits&quot;.&quot;GRD Product Current&quot;.&quot;GRD Product Level 5 Name&quot; ='Hire purchase and equipment loans' THEN 'Fee Based' ELSE &quot;F&amp;R Sales, Balances, Exposures and Limits&quot;.&quot;GRD Product Current&quot;.&quot;GRD Product Level 5 Name&quot; END" saw-sql:displayFormula=" CASE  WHEN &quot;GRD Product Current&quot;.&quot;GRD Product Level 5 Name&quot; = 'Bill financing' THEN 'Deposits' WHEN &quot;GRD Product Current&quot;.&quot;GRD Product Level 5 Name&quot; IN ('Operating lease', 'Finance lease') THEN 'Lending' WHEN &quot;GRD Product Current&quot;.&quot;GRD Product Level 5 Nam" saw-sql:aggregationRule="none" saw-sql:aggregationType="nonAgg" saw-sql:tableHeading="GRD Product Current" saw-sql:columnHeading="Product" saw-sql:isDoubleColumn="false" saw-sql:columnID="c062984f028c318df" />
        <xsd:element name="Column2" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:sqlFormula="&quot;F&amp;R Sales, Balances, Exposures and Limits&quot;.&quot;Balances - Spot&quot;.&quot;Closing Balance&quot;" saw-sql:displayFormula="&quot;Balances - Spot&quot;.&quot;Closing Balance&quot;" saw-sql:aggregationRule="dimAggr" saw-sql:aggregationType="agg" saw-sql:tableHeading="Balances - Spot" saw-sql:columnHeading="Actual" saw-sql:isDoubleColumn="false" saw-sql:columnID="ca1e1d4f511a8bf93" />
        <xsd:element name="Column3" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:sqlFormula="(&quot;F&amp;R Sales, Balances, Exposures and Limits&quot;.&quot;Balances - Spot&quot;.&quot;Closing Balance&quot;)*1.5" saw-sql:displayFormula="&quot;Balances - Spot&quot;.&quot;Closing Balance&quot; * 1.5" saw-sql:aggregationRule="complex" saw-sql:aggregationType="agg" saw-sql:tableHeading="Balances - Spot" saw-sql:columnHeading="Forecast" saw-sql:isDoubleColumn="false" saw-sql:columnID="ca00747c911de130f" />
        <xsd:element name="Column4" type="xsd:double" minOccurs="0" maxOccurs="1" saw-sql:type="double" saw-sql:sqlFormula="&quot;F&amp;R Sales, Balances, Exposures and Limits&quot;.&quot;Limits&quot;.&quot;Limit Amount&quot;*2" saw-sql:displayFormula="&quot;Limits&quot;.&quot;Limit Amount&quot; * 2" saw-sql:aggregationRule="complex" saw-sql:aggregationType="agg" saw-sql:tableHeading="Balances - Spot" saw-sql:columnHeading="Target" saw-sql:isDoubleColumn="false" saw-sql:columnID="c88758b2e449f89d0" />
      </xsd:sequence>
    </xsd:complexType>
  </xsd:schema>
  <Row>
    <Column0>Sep-13</Column0>
    <Column1>Deposits</Column1>
    <Column2>330393232.5</Column2>
    <Column3>495589848.75</Column3>
    <Column4>703232974</Column4>
  </Row>
  <Row>
    <Column0>Sep-13</Column0>
    <Column1>Fee Based</Column1>
    <Column2>111868709.42</Column2>
    <Column3>167803064.13</Column3>
    <Column4>703232974</Column4>
  </Row>
  <Row>
    <Column0>Sep-13</Column0>
    <Column1>Lending</Column1>
    <Column2>18146873.33</Column2>
    <Column3>27220309.995</Column3>
    <Column4>703232974</Column4>
  </Row>
</rowset>

由于转换基
{System.SystemException}={“无法将'System.Xml.Linq.XText'类型的对象强制转换为'System.IConvertible'。}

根据您的编辑,是否需要多个Column4条目?定义并没有使它看起来像是这样,所以这种方法应该有效:

Target = (decimal)result.Element(ns + "Column4")
否则,如果确实需要数组,请在
FirstNode
调用中添加
ToString

Target = result.Elements(ns + "Column4").Select(s => Convert.ToDecimal(s.FirstNode.ToString())).ToArray()
也就是说,不清楚为什么您使用
FirstNode
方法选择了不同的路线。这应该是可行的,而且对我来说似乎更清楚:

Target = result.Elements(ns + "Column4").Select(s => (decimal)s).ToArray()

转换为
decimal
而不是使用
Convert。在
选择
方法中转换为decimal

var resultSet = (xmlDoc.Root.Descendants(ns + "Row").Select(result => new
{
    MonthYearShortName = (DateTime)result.Element(ns + "Column0"),
    Product = (String)result.Element(ns + "Column1"),
    Actual = (decimal)result.Element(ns + "Column2"),
    Forecast = (decimal)result.Element(ns + "Column3"),
    Target = result.Elements(ns + "Column4").Select(s => (decimal)s).ToArray()
}));
但是,只有当您希望存在多个
Column4
元素时,这才有意义。否则,您可以只执行以下操作:

    Target = (decimal)result.Element(ns + "Column4")
或仅使用一个值获取十进制[]

    Target = new []  { (decimal)result.Element(ns + "Column4") }

让我们考虑一下。您的XML是否包含
Column4
元素?我看不到任何.Oops,编辑了OP。感谢将OP编辑为包含名称空间。我忘了。现在我得到了一个例外。@Navyseal我正在使用您提供的XML,它可以正常工作。如果您的XML与所发布的不同,我就不知道问题出在哪里。我最好的猜测是,您可能有一行缺少第4列,如果使用我建议的第一种方法
Element
,这将失败。解决此问题的一种方法是使用
(decimal?
)强制转换为可为空的十进制数。或者,
Elements
方法也可以,但这意味着您要取回一个数组(或集合)。我需要将数据作为目标数组返回,因为它必须在类需要目标数组的其他地方使用。我尝试使用FirstNode,假设我能够获得FirstNode元素。当我尝试这个Target=result.Elements(ns+“Column4”).Select(s=>(decimal)s.ToArray()时,我得到了一个空的目标,基本上是{MonthYearShortName={9/13/2014 12:00:00 am},Product=“Lending”,Actual=18146873.33,Forecast=27220309.995,Target={decimal[1]}
    Target = new []  { (decimal)result.Element(ns + "Column4") }