Простой способ разбора XML и JSON в Dynamics 365

Некоторое время назад мне пришлось создать интерфейс между Dynamics 365 и веб-сервисом, который возвращал данные в виде XML. Я решил использовать XML-классы X++ (XmlDocument, XmlNodeList, XmlElement и т. д.) для анализа XML и получения данных. Эти классы ужасны. Они делают свою работу, но слишком сложно. Есть лучше способ для быстрого анализа XML или JSON в Dynamics 365.

.NET в помощь

В Visual Studio есть функция, которая поможет нам в этом, но она недоступна в проектах Unified Operations. Откройте Visual Studio и создайте новый проект .NET. Теперь вам просто нужно скопировать образец XML-текста, который вы хотите проанализировать, перейдите в меню «Edit», «Paste Special», «Paste XML As Classes»:

И у нас будет контракт данных с необходимыми элементами для доступа ко всем узлам элементов с использованием классов и точечной нотации для доступа к данным! Например, для this sample XML file мы получим следующее:

namespace AASXMLHelper
{
 
    // NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class catalog
    {
 
        private catalogBook[] bookField;
 
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("book")]
        public catalogBook[] book
        {
            get
            {
                return this.bookField;
            }
            set
            {
                this.bookField = value;
            }
        }
    }
 
    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class catalogBook
    {
 
        private string authorField;
 
        private string titleField;
 
        private string genreField;
 
        private decimal priceField;
 
        private System.DateTime publish_dateField;
 
        private string descriptionField;
 
        private string idField;
 
        /// <remarks/>
        public string author
        {
            get
            {
                return this.authorField;
            }
            set
            {
                this.authorField = value;
            }
        }
 
        /// <remarks/>
        public string title
        {
            get
            {
                return this.titleField;
            }
            set
            {
                this.titleField = value;
            }
        }
 
        /// <remarks/>
        public string genre
        {
            get
            {
                return this.genreField;
            }
            set
            {
                this.genreField = value;
            }
        }
 
        /// <remarks/>
        public decimal price
        {
            get
            {
                return this.priceField;
            }
            set
            {
                this.priceField = value;
            }
        }
 
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute(DataType = "date")]
        public System.DateTime publish_date
        {
            get
            {
                return this.publish_dateField;
            }
            set
            {
                this.publish_dateField = value;
            }
        }
 
        /// <remarks/>
        public string description
        {
            get
            {
                return this.descriptionField;
            }
            set
            {
                this.descriptionField = value;
            }
        }
 
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string id
        {
            get
            {
                return this.idField;
            }
            set
            {
                this.idField = value;
            }
        }
    }
 }

Вы можете создать это в библиотеке классов .NET и использовать в Finance and Operations. Это самый быстрый способ использования всех классов и членов классов. Возможно, все это можно реализовать в виде классов Dynamics 365, но вам нужно создать столько классов, сколько существует различных типов узлов в XML. И первоначальная цель этого заключалась в том, чтобы быстрее разбирать XML-файл. Я бы просто придерживался библиотеки .NET.

Все эти шаги также действительны для файла JSON, скопируйте образец текста JSON, вставьте специальной вставкой, и вы получите все классы, необходимые для доступа к данным.

Use it in Dynamics 365

Когда у вас есть библиотека или вы создали все классы в Finance and Operations (не делайте этого), добавьте ссылку на ваш проект и (следуя приведенному выше примеру) вам просто нужно сделать следующее:

catalog catalog = new catalog();
XmlSerializer         serializer = new XmlSerializer(catalog.GetType());
TextReader sr         = new StringReader(xmlSample);
        
catalog = serializer.Deserialize(sr);
 
catalogBook[]   books   = catalog.book;
catalogBook     book    = books.GetValue(0);

Объявите переменную того же типа, что и основной узел в файле XML, catalog в примере. Затем мы создадим новый XmlSerializer, используя наш тип, и создадим TextReader из XML в виде строки. Наконец, нам нужно десериализовать XML и присвоить результат каталогу и…

Как вы можете видеть, данные доступны с помощью точечной нотации и классов, которые были созданы с помощью специальной функции вставки.

С помощью инструментов, которые не являются специфическими для программирования на X++,  мы можем достичь результата, и это определенно быстрее, чем анализ файла XML с использованием классов Xml* из Dynamics 365.

Источник: https://ariste.info/en/2019/09/parse-xml-and-json-easily-in-msdyn365fo-quickly/

Comments

So empty here ... leave a comment!

Добавить комментарий

Sidebar