我有一个XML文档,基本上看起来像这样:
<Item>
<Seller>
<UserID>SomeSeller</UserID>
<FeedbackScore>2535</FeedbackScore>
</Seller>
</Item>
现在我正在尝试解析文档,如下所示:
var document = XDocument.Parse(upcList);
XNamespace ns = "urn:ebay:apis:eBLBaseComponents";
var result= document
.Descendants(ns + "Item")
.Select(item => new CustomClass
{
FeedBackScore = Convert.ToInt32(item.Descendants(ns+ "Seller")
.Where(p=>p.Name.LocalName=="FeedbackScore").FirstOrDefault()),
Sales = (int) item.Element(ns+"QuantitySold"),
Location = (string)item.Element(ns+"Location"),
CurrentPrice = (double)item.Element(ns + "CurrentPrice"),
Title = (string)item.Element(ns + "Title"),
ItemID = (string)item.Element(ns + "ItemID")
}).ToList();
请注意这部分我如何尝试解析FeedbackScore节点值:
FeedBackScore = Convert.ToInt32(item.Descendants(ns+ "Seller")
.Where(p=>p.Name.LocalName=="FeedbackScore").FirstOrDefault()),
但是当我尝试解析它时,我将所有“FeedbackScore”节点值都设为“0”:(
有人能告诉我我做错了什么,如何在这个节点“2535”中获取这个值?
FeedBackScore = Convert.ToInt32(item.Descendants(ns + "FeedbackScore").Value)
您错误地检查了Seller
节点而不是其子节点的名称。通过这样做,FirstOrDefault()
将产生null
(由于错误的节点,Where()
的条件永远不会满足)和Convert.ToIn32(null)
将产生0
。
要解决此问题,您可以直接使用“FeedbackScore”节点并像这样转换其值
FeedBackScore = Convert.ToInt32(item.Descendants("FeedBackValue").FirstOrDefault()?.Value),
Descendants
这里将返回Seller
元素,然后你检查它们中是否有任何名称FeedbackScore
。这是不可能的 - 他们不能同时拥有两个名字。
假设你只想在父母是FeedbackScore
时想要Seller
,你需要阅读Elements
元素的Seller
。
我还注意到您可以像对其他属性一样使用显式转换。
把它放在一起,这将有效:
FeedBackScore = (int) item.Elements(ns + "Seller")
.Elements(ns + "FeedbackScore")
.Single()
如果此元素不总是存在,则可以默认为0
:
FeedBackScore = (int?) item.Elements(ns + "Seller")
.Elements(ns + "FeedbackScore")
.SingleOrDefault() ?? 0;