1

我正在阅读一个如下所示的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<VehicleList>
 <Vehicle>
  <Item>
   <Name>F-150</Name>
   <Maker>Ford</Maker>
   <Color>Black</Color>
   <Price>30000</Price>
  </Item>
  <ItemSpecific>
   <NameValueList>
    <Name>Mileage</Name>
    <Value>56000</Value>
   </NameValueList>
   <NameValueList>
    <Name>Year</Name>
    <Value>2003</Value>
   </NameValueList>
  </ItemSpecific>
 </Vehicle>
 <!-- more Vehicle nodes here -->
</Vehicles>

这是从 eBay Web 服务返回的示例数据,所以不要在结构上折磨我。

无论如何,我正在使用这样的代码来读取 xml 并将所有车辆放在 List(of Vehicle) 对象中,如下所示:

   Dim vehicles = From v in doc...<Vehicle> _
   Let mile = (From x In v.<ItemSpecific>.<NameValueList> Where x.<Name>.Value = "Mileage" Select x.<Value>.Value).Single _
                   Let year = (From z In v.<ItemSpecific>.<NameValueList> Where z.<Name>.Value = "Year" Select z.<Value>.Value).Single _
                   Select New Vehicle With {.Name = v.<Item>.<Name>.Value, .Maker = v.<Item>.<Maker>.Value, .Color = v.<Item>.<Color>.Value, .Mileage = mile, .Year = year}

然后将结果绑定到呈现数据List(Of Vehicle)的 ASP.NET控件。如果所有需要的节点都存在,ListView一切顺利。例如,里程节点是有条件的,有时不存在。每当节点不存在时,我都会收到“ ”错误。Sequence contains no elements

我已经尝试了我所知道的一切来让事情正常工作。有没有办法测试 XElement 是否存在?

4

1 回答 1

2

It depends on what you want to do when the node is not there. For instance if Nothing is acceptable then you can switch from .Single to .SingleOrDefault. The latter will return Nothing in the case of an empty sequence and will not throw an exception.

Dim vehicles = From v in doc...<Vehicle> _
               Let mile = (From x In v.<ItemSpecific>.<NameValueList> Where x.<Name>.Value = "Mileage" Select x.<Value>.Value).SingleOrDefault _
               Let year = (From z In v.<ItemSpecific>.<NameValueList> Where z.<Name>.Value = "Year" Select z.<Value>.Value).SingleOrDefault _
               Select New Vehicle With {.Name = v.<Item>.<Name>.Value, .Maker = v.<Item>.<Maker>.Value, .Color = v.<Item>.<Color>.Value, .Mileage = mile, .Year = year}
于 2009-03-06T16:04:18.983 回答