Обход вложенного класса в XDocument в JSON - PullRequest
0 голосов
/ 14 мая 2019

В C # API я получаю xml-ответ, который мне нужно преобразовать в JSON, чтобы вернуть его моему клиентскому клиентскому приложению.Я не могу понять, как преобразовать вложенный потомок во вложенный класс.

У меня есть два класса C #, усеченных ниже.

public class DetailsKey
{
  public string Status {get; set;}
  public string ErrorMessage {get; set;}
  public string AmountApproved {get; set;}
  public PaymentDetails PaymentDetails {get; set;}
}

public class PaymentDetails
{
  public string Id {get;set;}
  public string PaymentType {get;set;}
  public string Customer {get;set;}
}

После получения ответа я анализирую его следующим образом:

XDocument xd = XDocument.Parse(result);

var detResponse = xd.Descendants().Where(x => x.Name.LocalName == "DetailsKey").Select(x => new DetailsKey()
{
  Status = (string)x.Element(x.Name.Namespace + "Status"),
  ErrorMessage = (string)x.Element(x.Name.Namespace + "ErrorMessage"),
  AmountApproved = (string)x.Element(x.Name.Namespace + "AmountApproved"),
  PaymentDetails = x.Descendants("PaymentDetails").Select(p => new PaymentDetails()
   {
     PaymentDetail = x.Descendants("PaymentDetail").Select(pd => new PaymentDetail(){
       Id = (string)pd.Element(pd.Name.Namespace + "Id"),
       ErrorMessage = (string)pd.Element(pd.Name.Namespace + "ErrorMessage"),
       PaymentType = (string)pd.Element(pd.Name.Namespace + "PaymentType"),
       Customer = (string)pd.Element(pd.Name.Namespace + "Customer")
       }).FirstOrDefault(),
    }).FirstOrDefault(),
 }).FirstOrDefault();

Если я закомментирую «PaymentDetails = ...», ошибок нет.Но когда я пытаюсь проанализировать потомок PaymentDetails, я получаю ошибки.Как правильно проанализировать потомка и поместить его во вложенный класс.

Вот пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<DetailsKey>
  <Status>APPROVED</Status>
  <AmountApproved>7.65</AmountApproved>
  <ErrorMessage/>
  <PaymentDetails>
   <PaymentDetail>
    <Id>12345</Id>
    <ErrorMessage/>
    <PaymentType>SALE</PaymentType>
    <Customer>John Smith</Customer>
   </PaymentDetail>
  </PaymentDetails>
</DetailsKey>
</soap:Body>
</soap:Envelope>

1 Ответ

0 голосов
/ 20 мая 2019

Были две проблемы. Сначала, как @mahlatse предложил в первом комментарии, мне нужно было добавить firstOrDefault () к каждому из вложенных потомков. После добавления ошибка была устранена. Но я все еще получал нулевое значение для вложенных потомков.

Второе исправление включало добавление:

.Where(x => x.Name.LocalName == "nameofElement")

перед вызовом Select и исключением строки nameOfElement в Descendants ().

После исправления преобразование xml в JSON сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...