“Lodgx.Classes.Models.Timespan”类型的表达式是不可查询的

时间:2014-02-13 18:17:03

标签: xml vb.net linq

这里我再次提出一个关于我正在解析的XML的问题。我正在尝试获取Element TimeSpan及其属性。这是我正在使用的代码

Dim time As Timespan = From el In _xDoc.Elements(_ns + "TimesSpan").Select(Function(e) New Timespan With { _
                                                                .Duration = e.Attribute("Duration"), _
                                                                .StartDate = e.Attribute("Start"), _
                                                                .EndDate = e.Attribute("End")}).FirstOrDefault()

但这给了我错误

  

'Lodgx.Classes.Models.Timespan'类型的表达式是不可查询的。   确保您没有错过程序集引用和/或命名空间   导入LINQ提供程序。

修改

我将代码更改为:

Dim time = From el As XElement In _xDoc.Elements(_ns + "TimeSpan")
                       Select New Timespan With { _
                           .Duration = el.Attribute("Duration").Value, _
                           .StartDate = el.Attribute("Start").Value, _
                           .EndDate = el.Attribute("End").Value}

Return time.First()

现在,当我运行它时,我收到一条消息> 序列中不包含元素返回 time.First()

编辑#2

_xDoc是一个XDocument,它从Web服务调用中加载XML字符串

Dim _xDoc = XDocument.Load(str)

我检查了 str 的值,这是我所期待的

@MarcinJuraszek:这是XML的一个小样本(这是一个巨大的文件,所以我只发布一些包含Element TimeSpan的内容,我试图从中获取属性值)

<?xml version="1.0" encoding="utf-16"?>
<HotelPropertyDescriptionRS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" TimeStamp="2013-12-30T18:49:36" Version="1.14.1">
  <Success xmlns="http://webservices.sabre.com/sabreXML/2003/07" />
<RoomStay xmlns="http://webservices.sabre.com/sabreXML/2003/07">
    <Guarantee>
      <DepositsAccepted>
        <PaymentCard CardType="AMERICAN EXPRESS" CardCode="AX" />
        <PaymentCard CardType="MASTERCARD" CardCode="CA" />
        <PaymentCard CardType="DINERS CLUB CARD" CardCode="DC" />
        <PaymentCard CardType="DISCOVER CARD" CardCode="DS" />
        <PaymentCard CardType="MASTER CARD" CardCode="IK" />
        <PaymentCard CardType="JCB CREDIT CARD" CardCode="JC" />
        <PaymentCard CardType="VISA" CardCode="VI" />
      </DepositsAccepted>
      <GuaranteesAccepted>
        <PaymentCard CardType="AMERICAN EXPRESS" CardCode="AX" />
        <PaymentCard CardType="MASTERCARD" CardCode="CA" />
        <PaymentCard CardType="DINERS CLUB CARD" CardCode="DC" />
        <PaymentCard CardType="DISCOVER CARD" CardCode="DS" />
        <PaymentCard CardType="MASTER CARD" CardCode="IK" />
        <PaymentCard CardType="JCB CREDIT CARD" CardCode="JC" />
        <PaymentCard CardType="VISA" CardCode="VI" />
        <Text>/GC-              COMPANY NAME AND ADDRESS</Text>
        <Text>/GAGT             GUARANTEE TO AGENCY TIDS/IATA NUMBER</Text>
        <Text>/GDPST            DEPOSIT WILL BE SENT</Text>
        <Text>/GDPST...         IMMEDIATE DEPOSIT TYPE OR FORM</Text>
      </GuaranteesAccepted>
    </Guarantee>
    <TimeSpan Duration="0005" Start="01-14" End="01-15" />
</RoomStay>
  </HotelPropertyDescriptionRS>

1 个答案:

答案 0 :(得分:1)

由于TimeSpan元素不是root的直接后代,因此您需要使用_xDoc.Descendants而不是_xDoc.Elements或指定完整路径(您可以使用 XPath

作为旁注,请注意命名类,.NET中已经有一个名为TimeSpan的类,它没有这些属性。

此外,您忘记包含名称空间声明:

Dim _ns As XNamespace =
  XNamespace.Get("http://webservices.sabre.com/sabreXML/2003/07")