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