下面为初学者解释LINQ to XML?

时间:2009-03-17 13:47:39

标签: linq-to-xml

有人可以解释下面的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>();
    }
}

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>

1 个答案:

答案 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,DE子元素的内部文本分配给每个已创建的每个新A,B,C,D对象的EListing属性。

包含: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节点匹配区分大小写。