XDocument C#解析节点内部的节点值

时间:2019-03-22 15:04:03

标签: c# asp.net xml asp.net-mvc xml-parsing

我有一个基本上像这样的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”中获取此值?

3 个答案:

答案 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;