[英]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 & 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 & 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.