我正在使用LINQ从XML文件中查找对象。找到对象后,我想打印其详细信息,但是我不确定如何使用找到的对象。
这是我的代码:
var apartmentExist =
from apartment1 in apartmentXml.Descendants("Apartment")
where (apartment1.Attribute("street_name").Value == newApartment.StreetName) &&
(apartment1.Element("Huose_Num").Value == newApartment.HouseNum.ToString())
select apartment1.Value;
if (apartmentExist.Any() == false)
{
Console.WriteLine("Sorry, Apartment at {0} or at num {1}", newApartment.StreetName,
newApartment.HouseNum);
}
else
{
//print the details of apartment1
}
我的XML是:
<?xml version="1.0" encoding="utf-8"?>
<Apartments>
<Apartment street_name="sumsum">
<Huose_Num>13</Huose_Num>
<Num_Of_Rooms>4</Num_Of_Rooms>
<Price>10000</Price>
<Flags>
<Elevator>true</Elevator>
<Floor>1</Floor>
<parking_spot>true</parking_spot>
<balcony>true</balcony>
<penthouse>true</penthouse>
<status_sale>true</status_sale>
</Flags>
</Apartment>
</Apartments>
您的LINQ查询返回IEnumerable<XElement>
如果您希望它返回更多,则可以使用foreach
循环来打印元素,如果只有一个结果,则可以调用.Single()
扩展方法来获取XElement
,而不是集合:
XElement
与string
使用XElement.Value
属性相比,强制转换为更安全,因为NullReferenceException
在元素不存在时不会抛出。您还应该使用(int)XElement
强制转换和比较数字,而不是XElement.Value
将其与数字的字符串表示形式进行比较。
您不应使用Descendants
方法,Elements
而应使用。这将使您的查询更快,因为仅将处理需要搜索的元素。
您应该先致电FirstOrDefault
并检查结果是否null
代替,Any
然后再First
致电。这将阻止您的查询执行两次。
而不是返回本身apartment1.Value
为a的string
return apartment1
。它将成为XElement
您,以后有必要时您就可以了解它的内容。
var apartmentExist =
from apartment1 in apartmentXml.Root.Elements("Apartment")
where ((string)apartment1.Attribute("street_name") == newApartment.StreetName) &&
((int)apartment1.Element("Huose_Num") == newApartment.HouseNum)
select apartment1;
var apartment = apartmentExist.FirstOrDefault();
if (apartment == null)
{
Console.WriteLine("Sorry, Apartment at {0} or at num {1}", newApartment.StreetName, newApartment.HouseNum);
}
else
{
// you can use apartment variable here. It's an XElement
var huoseNum = (string)apartment.Element("Huose_Num");
// flags
foreach(var flag in apartment.Elements("Flags"))
{
var name = flag.Name;
var value = (string)flag;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句