我有一个相当复杂的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的新手,但根据应该有用的文档。
答案 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 & 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>();