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

问题描述 投票:0回答:3

我有一个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”中获取这个值?

c# asp.net xml asp.net-mvc xml-parsing
3个回答
1
投票
FeedBackScore = Convert.ToInt32(item.Descendants(ns + "FeedbackScore").Value)

1
投票

您错误地检查了Seller节点而不是其子节点的名称。通过这样做,FirstOrDefault()将产生null(由于错误的节点,Where()的条件永远不会满足)和Convert.ToIn32(null)将产生0

要解决此问题,您可以直接使用“FeedbackScore”节点并像这样转换其值

FeedBackScore = Convert.ToInt32(item.Descendants("FeedBackValue").FirstOrDefault()?.Value),

1
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.