2

有人可以解释下面的 LINQ to XML 吗?另外,检查方法是否返回带有数据的列表的正确方法是什么?你只是检查列表是否为空。

代码:

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>();
    }
}

XML:

<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>
4

1 回答 1

2

您可以通过检查变量上的方法listings的结果来检查是否有任何数据,并回答下面评论部分中提出的问题,“所以,没有办法实际返回?我必须返回一个对象?”,请看以下代码:Count()listingsnullList<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,DEA,B,C,DEListing

包含:的行返回对象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 节点匹配区分大小写。

于 2009-03-17T14:00:19.000 回答