有人可以解释下面的LINQ to XML吗?另外,检查方法是否返回带有数据的List的正确方法是什么?你只是检查列表是否为空。
public List<Listing> GetList()
{
if (File.Exists(this.xmlFilePath))
{
XDocument doc = XDocument.Load(this.xmlFilePath);
var listings = from row in doc.Root.Elements("listing")
select new Listing
{
A = (string)row.Element("A"),
B = (string)row.Element("B"),
C = (string)row.Element("C"),
D = (string)row.Element("D"),
E = (string)row.Element("E")
};
return listings.ToList();
}
else
{
return new List<Listing>();
}
}
<Listings>
<listing>
<a>A</a>
<b>B</b>
<c>C</c>
<d>D</d>
<e>E</e>
</listing>
<listing>
<a>F</a>
<b>G</b>
<c>C</c>
<d>H</d>
<e>I</e>
</listing>
</Listings>
答案 0 :(得分:2)
您可以通过检查listings
变量上Count()
方法的结果来检查listings
是否有任何数据,并回答下面评论部分中提出的问题,“所以,实际上无法返回null
?我必须返回List<listing>()
个对象?“,请参阅以下代码:
public List<Listing> GetList()
{
if (File.Exists(this.xmlFilePath))
{
XDocument doc = XDocument.Load(this.xmlFilePath);
var listings = from row in doc.Root.Elements("listing")
select new Listing
{
A = (string)row.Element("A"),
B = (string)row.Element("B"),
C = (string)row.Element("C"),
D = (string)row.Element("D"),
E = (string)row.Element("E")
};
// Check if we have any matches
if(listings.Count() > 0)
{
return listings.ToList();
}
return null;
}
return null;
}
我认为这就是你所追求的目标。
关于代码如何工作没有太多解释。在查询的第一部分:
var listings = from row in doc.Root.Elements("listing")
表达式doc.Root.Elements("listing")
选择文档根目录下的所有<listing>
元素(<Listings>
)。
查询的第二部分为每个Listing
元素创建一个新的<listing>
对象,并将每个A,B,C,D
和E
子元素的内部文本分配给每个已创建的每个新A,B,C,D
对象的E
和Listing
属性。
包含:return listings.ToList();
的行会返回List<T>
个Listing
个对象的通用。
使用提供的示例XML,您会发现每个Listing
对象的A,B,C,D,
和E
属性都是null
。这是因为每个row.Element()
选择器的字符大小写与查询的XML不同,即您的XML有<a>
而row.Element("A")
使用大写'A'
。 LINQ to XML中的XML节点匹配区分大小写。