Анализ Xml и привязка к listview в формах xamarin

#c# #xml #xamarin.forms

#c# #xml #xamarin.forms

Вопрос:

Привет, я пытаюсь проанализировать XML в моем приложении xamarin.forms.XML-данные содержат один идентификатор транзакции и пару вопросов с несколькими ответами. Чего я пытаюсь достичь, так это привязать вопросы к ярлыкам и ответы к выпадающим спискам в listview.

XML, который я получаю из API

 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
<PlatformResponse>
  <TransactionDetails>
    <TransactId>39562</TransactionId>
  </TransactionDetails>
  <Response>
    <Questions>
      <Question type="1" text="Which one is correct?">
        <Answer correct="false">test1</Answer>
        <Answer correct="false">test2</Answer>
        <Answer correct="false">test3</Answer>
        <Answer correct="false">test4</Answer>
        <Answer correct="false">test5</Answer>
        <Answer correct="false">test5</Answer>  
      </Question>
      <Question type="2" text="Which one is associated with you?">
        <Answer correct="false">test1</Answer>
        <Answer correct="false">test2</Answer>
        <Answer correct="false">test3</Answer>
        <Answer correct="false">test4</Answer>
        <Answer correct="false">test5</Answer>
        <Answer correct="false">test5</Answer> 
      </Question>
      <Question type="3" text="Which one of the following is true ?">
         <Answer correct="false">test1</Answer>
        <Answer correct="false">test2</Answer>
        <Answer correct="false">test3</Answer>
        <Answer correct="false">test4</Answer>
        <Answer correct="false">test5</Answer>
        <Answer correct="false">test5</Answer> 
      </Question>
    </Questions>
  </Response>
</PlatformResponse>
  

Как я его анализирую

  HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
                    webRequest.ProtocolVersion = HttpVersion.Version10;
                    webRequest.Method = "POST";
                    webRequest.ContentType = "text/xml charset=utf8";
                    webRequest.ContentLength = postData.Length;
                    Stream requestStream = webRequest.GetRequestStream();
                    requestStream.Write(postData, 0, postData.Length);
                    requestStream.Close();
                    HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                    StreamReader reader = new StreamReader(webResponse.GetResponseStream());
                    string reader2 = reader.ReadToEnd();
                    List<XmlData> ObjXmlData = new List<XmlData>();
                    XDocument doc = XDocument.Parse(reader2);

           // How Can I bind it to the listview
  

Моя модель данных

    public class XmlData
     {
          public string TransactionId { get; set; }
          public string Question { get; set; }
          public string Answer { get; set; }        
     }
  

Мой просмотр списка

                 <ListView  x:Name="QuestionsListView"  ItemsSource="{Binding}"
                     HasUnevenRows="True"                                                              
                     HorizontalOptions="FillAndExpand"
                     VerticalOptions="FillAndExpand">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <ViewCell.View>
                                    <StackLayout>
                                        <StackLayout Orientation="Horizontal">
                                            <Label Text="•" FontSize="Medium" TextColor="Green" Margin="0,20,0,0"/>
                                            <Label Text="{Binding Question}" FontSize="Small" TextColor="#474747" Margin="0,20,0,0">                                               
                                            </Label>
                                           </StackLayout>
                                            <StackLayout Orientation="Horizontal" Margin="10,0,10,0" HorizontalOptions="FillAndExpand" >                                             
                                            <Picker x:Name="picker1" Title="Select answer" ItemDisplayBinding="{Binding Answer}" HorizontalOptions="FillAndExpand" FontSize="Small" TextColor="Gray">
                                            </Picker>
                                            <Image Source="downarrow.png" HorizontalOptions="End" HeightRequest="20" WidthRequest="20" ></Image>
                                        </StackLayout>
                                    </StackLayout>
                                </ViewCell.View>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView

>
  

Как я могу привязать эти вопросы и ответы к средству выбора и ярлыку. Приветствуется любая помощь.

Комментарии:

1. 1) Вы хотите сгладить свой XDocument в соответствии с вашей моделью? ИЛИ 2) Вы хотите привязать свою модель к представлению списка?

2. @er-sho Я хочу проанализировать xml и привязать его к моему listview

3. @ er-sho, где я застрял, создает модель представления в соответствии с xml и привязывает к listview после синтаксического анализа

4. означает, что у вас есть 2 вопроса в одном сообщении, не могли бы вы, пожалуйста, отредактировать свое сообщение и задать эти 2 вопроса в другом сообщении. в противном случае, скорее всего, ваш пост был отмечен пользователями как для широкого доступа.

5. @er-sho, братан, извини. Мой вопрос в том, как я могу заставить xml привязываться к listview. Я застрял при создании модели данных

Ответ №1:

1) На ваш первый вопрос,

Ниже приведены модели классов для анализа вашего xml,

 class Answer
{
    public string Text { get; set; }
    public bool Correct { get; set; }
}

class Question
{
    public string Ques { get; set; }
    public string Type { get; set; }
    public List<Answer> Answers { get; set; }
}

class Tranzaction
{
    public string TransactionId { get; set; }
    public List<Question> Questions { get; set; }
}
  

И с помощью LINQ to XML вы можете проанализировать свой xml для моделей вышеуказанного класса, таких как,

 XDocument doc = XDocument.Parse("Your xml text here");

List<Tranzaction> transactions = (from p in doc.Descendants("PlatformResponse")
              select new Tranzaction
              {
                  TransactionId = p?.Elements("TransactionDetails")?.FirstOrDefault()?.Element("TransactionId")?.Value.Trim(),
                  Questions = (from q in p?.Descendants("Questions")?.Elements("Question")
                               select new Question
                               {
                                   Ques = q?.Attribute("text")?.Value,
                                   Type = q?.Attribute("type")?.Value,
                                   Answers = (from a in q?.Elements("Answer")
                                              select new Answer
                                              {
                                                  Text = a?.Value,
                                                  Correct = Convert.ToBoolean(a?.Attribute("correct")?.Value)
                                              }).ToList()
                               }).ToList()

              }).ToList();
  

2) По вашему второму вопросу,

Теперь вы можете создать один из них ObservableCollection для приведенного выше результата запроса и привязать его к представлению списка в вашей форме xamarin, например

 ObservableCollection<Tranzaction> tranzactionsOC = new ObservableCollection<Tranzaction>(transactions);
  

Теперь это tranzactionsOC ваше ObservableCollection приложение, и вы можете привязать его к своей форме xamarin

Комментарии:

1. @Bro извините за беспокойство. Верны ли мои привязки к xaml?

2. @AndroDevil, помните ?. , используется для проверки на нуль и введен в c # 6. Если это выдает ошибку на вашей стороне, просто удалите ее

3. @AndroDevil, не уверен насчет привязки к xaml, потому что я в основном работаю с XML и Web API, поэтому сложно сказать, но вы можете найти какой-то способ, если погуглите. По любому решению я проконсультируюсь со своими коллегами по xamarin.

4. @AndroDevil, но приведенная выше коллекция observable, скорее всего, включает все ваши данные в xml, и я думаю, вам следует ее использовать.