我有一个基本上像这样的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”中获取此值?
答案 0 :(得分:1)
FeedBackScore = Convert.ToInt32(item.Descendants(ns + "FeedbackScore").Value)
答案 1 :(得分:1)
您错误地检查了Seller
节点而不是其子节点的名称。这样,FirstOrDefault()
将产生null
(由于错误的节点,永远不会满足Where()
的条件),而Convert.ToIn32(null)
将产生0
。
要解决此问题,您可以直接转到“ FeedbackScore”节点并像这样转换其值
FeedBackScore = Convert.ToInt32(item.Descendants("FeedBackValue").FirstOrDefault()?.Value),
答案 2 :(得分:1)
Descendants
在这里将返回Seller
元素,然后检查是否有任何元素名为FeedbackScore
。这是不可能的-他们不能一次拥有两个名字。
如果父级为FeedbackScore
,假设只希望Seller
,则需要读取Elements
元素中的Seller
。 / p>
我还要注意,您可以像对其他属性一样使用显式转换。
将它们放在一起,将可以工作:
FeedBackScore = (int) item.Elements(ns + "Seller")
.Elements(ns + "FeedbackScore")
.Single()
如果此元素并不总是存在,则可以默认为0
:
FeedBackScore = (int?) item.Elements(ns + "Seller")
.Elements(ns + "FeedbackScore")
.SingleOrDefault() ?? 0;