簡體   English   中英

Linq to XML查詢未選擇任何內容

[英]Linq to XML Query not picking anything

我有一個相當復雜的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的新手,但是根據應該可以使用的文檔。

首先,您沒有有效的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();

問題在於您使用的.Elements(XName)似乎是遞歸的。 不是,它僅檢查目標的直接子對象(在這種情況下為文檔)。

我相信您要查找的函數是.Descendants(XName) ,它將以遞歸方式查找,但是請注意,在大型XML文檔中,這並不是很快。

問題是元素和后代之間的區別

  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被刪除以進行發布,但是您的實際代碼中包含真實的名稱空間。 如果不是,那可能是您首先需要解決的問題。

原來我需要添加名稱空間進行查詢。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM