XDocument C # анализирует значение узла внутри узла - PullRequest
0 голосов
/ 22 марта 2019

У меня есть 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 ]

1 голос
/ 22 марта 2019

Вы ошибочно проверили имена узлов Seller, а не его дочерних элементов. Таким образом, FirstOrDefault() даст null (условие Where() никогда не будет выполнено из-за неправильного узла), а Convert.ToIn32(null) даст 0.

Чтобы исправить это, вы можете напрямую перейти к узлу «FeedbackScore» и преобразовать его значение следующим образом

FeedBackScore = Convert.ToInt32(item.Descendants("FeedBackValue").FirstOrDefault()?.Value),
1 голос
/ 22 марта 2019

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;
1 голос
/ 22 марта 2019
FeedBackScore = Convert.ToInt32(item.Descendants(ns + "FeedbackScore").Value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...