Linq to XML Query没有选择任何东西

时间:2011-10-07 21:27:44

标签: c# xml linq-to-xml

我有一个相当复杂的XML文档

<ItemSearchResponse xmlns="-------">
  <OperationRequest>
    <HTTPHeaders>
    </HTTPHeaders>
    <RequestId>0S57WGDPNC7T8HNBV76K</RequestId>
    <Arguments>
    </Arguments>
    <RequestProcessingTime>0.441776990890503</RequestProcessingTime>
  </OperationRequest>
  <Items>
    <Request>
      <ItemSearchRequest>
      </ItemSearchRequest>
    </Request>
    <TotalResults>1020</TotalResults>
    <TotalPages>102</TotalPages>
    <Item>
      <ASIN>B004WL0L9S</ASIN>
      <SalesRank>1</SalesRank>
      <ItemAttributes>
         <Manufacturer>Georgia Pacific Consumer Products LP (Cut-Sheet Paper)</Manufacturer>
         <Title>GP Copy &amp; Print Paper, 8.5 x 11 Inches Letter Size, 92 Bright White, 20    Lb, Ream of 500 Sheets (998067R)</Title>
      <ItemAttributes>
    </Item>
  <Items>

我对它运行此查询并返回零列表:

XDocument doc = XDocument.Load(url);
List<Item> Items = (from c in doc.Elements("Item")
          select new Item
          {
            Title = c.Element("Title").Value
            SaleRank = c.Element("SaleRank").Value
            ASIN = c.Element("ASIN").Value
           }).ToList<Item>();

我是XLinq的新手,但根据应该有用的文档。

4 个答案:

答案 0 :(得分:1)

首先,你没有有效的xml。以下是它应该如何显示的示例:

<ItemSearchResponse >
    <OperationRequest>
        <HTTPHeaders> </HTTPHeaders>
        <RequestId>0S57WGDPNC7T8HNBV76K</RequestId>
        <Arguments> </Arguments>
        <RequestProcessingTime>0.441776990890503</RequestProcessingTime>
    </OperationRequest>
    <Items>
        <Request>
            <ItemSearchRequest> </ItemSearchRequest>
        </Request>
        <TotalResults>1020</TotalResults>
        <TotalPages>102</TotalPages>
        <Item>
            <ASIN>B004WL0L9S</ASIN>
            <SalesRank>1</SalesRank>
            <ItemAttributes>
                <Manufacturer>Georgia Pacific Consumer Products LP (Cut-Sheet Paper)</Manufacturer>
                <Title>GP Copy &amp; Print Paper, 8.5 x 11 Inches Letter Size, 92 Bright White, 20 Lb, Ream of 500 Sheets (998067R)</Title>
            </ItemAttributes>
        </Item>
    </Items>
</ItemSearchResponse>

此代码适用于它:

var Items = (from c in doc.Root.Element("Items").Elements("Item")
                  select new Item()
                  {
                    Title = c.Element("ItemAttributes").Element("Title").Value,
                    SaleRank = c.Element("SalesRank").Value,
                    ASIN = c.Element("ASIN").Value
                   }).ToList();

Descendants

var Items = (from c in doc.Root.Descendants("Item")
                  select new
                  {
                    Title = c.Element("ItemAttributes").Element("Title").Value,
                    SaleRank = c.Element("SalesRank").Value,
                    ASIN = c.Element("ASIN").Value
                   }).ToList();

答案 1 :(得分:0)

问题在于你使用.Elements(XName),你似乎假设它是递归的。它不是,它只检查目标的直接孩子(在这种情况下是文件)。

我相信你正在寻找的函数是.Descendants(XName),它将以递归的方式显示,但请注意,这在大量的XML文档上并不是很快。

答案 2 :(得分:0)

问题是元素和后代之间的区别

  var items = (from c in doc.Descendants("Item")
               select new Item
               {
                 Title = c.Element("ItemAttributes").Element("Title").Value,
                 SaleRank = c.Element("SalesRank").Value,
                 ASIN = c.Element("ASIN").Value
               }).ToList<Item>();

元素直接位于当前元素下方的Xml元素列表(即只有1级深度)。后代将检索所有元素。

根据您的Xml和您的查询,我展示了使用Descendant和Element。初始循环使用Descendants(),但是对Title的访问用于链接Element()调用。

我尝试运行代码,我假设xmlns已被删除以便发布,但您的实际代码中有一个真正的命名空间。如果没有,那么您可能需要首先解决这个问题。

答案 3 :(得分:0)

原来我需要添加命名空间来进行查询。

XNamespace ns = NAMESPACE;

var items = (from c in doc.Descendants(ns +"Item")
    select new Item
    {
       Title = c.Element(ns + "ItemAttributes").Element(ns + "Title").Value,
       SalesRank = c.Element(ns +"SalesRank").Value,
       ASIN = c.Element(ns + "ASIN").Value
    }).ToList<Item>();