#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, и я думаю, вам следует ее использовать.