#xamarin.forms #xml-parsing
#xamarin.forms #xml-синтаксический анализ
Вопрос:
Я пытаюсь проанализировать простой XML-файл в приложении Xamarin (Visual Studio) Forms. Я использую приведенный здесь пример
Это не работает. Сериализатор возвращает список объектов узла, но они пусты. Я включаю свой код ниже, но он должен быть идентичен примеру с некоторыми изменениями имени. Мой XML-файл находится в корне решения, и его действие сборки настроено как встроенный ресурс.
namespace EZCal
{
public partial class MainPage : ContentPage
{
// description of a menu tree node
public class Node
{
// TODO: move strings to external file so they can be Localized
public int id { get; set; } // the ID of this node. Never null
public int idParent { get; set; } // NULL for top-level nodes
public String desc1 { get; set; } // text to be displayed - line 1
public String desc2 { get; set; } // text to be displayed - line 1
public String command { get; set; } // command string to be sent to device
}
public MainPage()
{
InitializeComponent();
this.parseXML();
}
void parseXML() {
var assembly = System.Reflection.IntrospectionExtensions.GetTypeInfo(typeof(MainPage)).Assembly;
System.IO.Stream stream = assembly.GetManifestResourceStream("EZCal.MenuDefinitions.xml");
List<Node> menuNodes;
using (var reader = new System.IO.StreamReader(stream))
{
var serializer = new XmlSerializer(typeof(List<Node>));
menuNodes = (List<Node>) serializer.Deserialize(reader);
}
var listView = new ListView();
listView.ItemsSource = menuNodes;
}
}
}
Вот мой XML-файл:
<?xml version="1.0" encoding="UTF-8" ?>
<ArrayOfNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Node>
<NodeId>1</NodeId>
<ParentId>0</ParentId>
<Display1>Home line 1</Display1>
<Display2>Home line 2</Display2>
<Command>Home Command</Command>
</Node>
<Node>
<NodeId>2</NodeId>
<ParentId>1</ParentId>
<Display1>Help line 1</Display1>
<Display2>Help line 2</Display2>
<Command>Help Command</Command>
</Node>
<Node>
<NodeId>3</NodeId>
<ParentId>1</ParentId>
<Display1>Diags line 1</Display1>
<Display2>Diags line 2</Display2>
<Command>Diags Command</Command>
</Node>
<Node>
<NodeId>4</NodeId>
<ParentId>1</ParentId>
<Display1>Access line 1</Display1>
<Display2>Access line 2</Display2>
<Command>Access Command</Command>
</Node>
</Node>
</ArrayOfNode>
Комментарии:
1. имена свойств в вашем классе узлов не имеют никакого отношения к именам свойств в XML-файле. Они либо должны совпадать, либо вам нужно предоставить сопоставление
2. @Jason это сработало. Спасибо. Если вы хотите опубликовать это как ответ, я приму его.
Ответ №1:
Имена свойств в вашей модели должны совпадать с именами узлов в вашем XML, чтобы десериализация выполнялась автоматически.
Кроме того, вы можете применить атрибут сопоставления
[XmlElement("NodeId")]
public int id { get; set; }
Комментарии:
1. Изначально я переименовал свойства в своей модели в соответствии с XML. Это сработало. Но я предпочитаю этот метод — он проясняет связь с XML-тегами. Спасибо.