Простой способ разбора 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!