这里我再次提出一个关于我正在解析的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>
答案 0 :(得分:1)
由于TimeSpan元素不是root的直接后代,因此您需要使用_xDoc.Descendants
而不是_xDoc.Elements
或指定完整路径(您可以使用 XPath )
作为旁注,请注意命名类,.NET中已经有一个名为TimeSpan的类,它没有这些属性。
此外,您忘记包含名称空间声明:
Dim _ns As XNamespace =
XNamespace.Get("http://webservices.sabre.com/sabreXML/2003/07")