невозможно заполнить объекты XML-файлом в Xamarin

#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-тегами. Спасибо.