Работа с XML-документами в Dynamics AX 2012

XML – это расширяемый язык разметки. Он предназначен для структурирования, хранения и передачи данных. XML файл состоит из тегов, но сами теги не предопределены языком, их нужно определять самим. Структура файла так же не предопределена и может быть любой.

Создание xml документа

Поскольку теги в xml файлах определяются самим разработчиком, то следует соблюдать следующие правила наименований:

— пробелы в наименованиях не используются

— все наименование начинаются с буквы, после чего можно использовать цифры и другие допустимые символы

— регистр не учитывается

В xml файле первой строкой может быть указана декларация xml, она является не обязательной. В ней может быть указана версия и кодировка:

<?xml version="1.0" encoding="utf-8"?>

В xml файле корневой элемент должен быть только один, он будет являться своего рода оболочкой документа.

XmlDocument document = XmlDocument::newBlank();
XmlElement  header;
//создание корневого элемента    
header = document.createElement("pen");
    
...
    
//добавление корневого элемента в документ    
document.appendChild(header);
//сохранение документа во внешний файл
document.save("c:\\pen.xml");

Все остальные элементы будут вложенными в корневой элемент, так же у вложенных элементов могут быть свои вложенные элементы и т.д.

XmlElement  item;
    
...
//создание вложенного элемента
item = document.createElement("type");
item.innerText("ballpoint");
//добавление элемента в корневой элемент
header.appendChild(item);
    
...

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

XmlElement  item;
XmlElement  details;   
    
...

details = document.createElement("details");
item = document.createElement("detail");
//создание атрибута
item.setAttribute("name", "case");
item.setAttribute("material", "plastic");
details.appendChild(item);
    
...

Полностью код создания xml файла

XmlDocument document = XmlDocument::newBlank();
XmlElement  header;
XmlElement  item;
XmlElement  details;
XmlNode     node;

header = document.createElement("pen");

item = document.createElement("type");
item.innerText("ballpoint");
header.appendChild(item);

details = document.createElement("details");
item = document.createElement("detail");
item.setAttribute("name", "case");
item.setAttribute("material", "plastic");
details.appendChild(item);

item = document.createElement("detail");
item.setAttribute("name", "stick");
item.setAttribute("material", "plastic");
item.setAttribute("composition", "ink");
details.appendChild(item);

header.appendChild(details);

node = document.createNode(XmlNodeType::Element, "description", "");
node.innerText("write text on paper");

header.appendChild(node);

document.appendChild(header);
document.save("c:\\pen.xml");

XML файл полученный в результате выполнения кода

<?xml version="1.0" encoding="utf-8"?>
<pen>
  <type>ballpoint</type>
  <details>
    <detail name="case" material="plastic" />
    <detail name="stick" material="plastic" composition="ink" />
  </details>
  <description>write text on paper</description>
</pen>

Чтение xml файла

Для того чтобы произвести чтение/парсинг xml файла, нужно его создать, либо из внешнего файла, либо из строки xml.

XmlDocument document = XmlDocument::newBlank();  
//загрузка из внешнего файла
document.load("c:\\pen.xml");
//создание из строки xml
document.loadXml("...");

После этого получаем корневой элемент из документа. Из корневого элемента можем получить вложенный элемент, из вложенного элемента свой вложенный элемент и т.д.

XmlElement  header;
XmlNode     node;
    
...
//корневой элемент 
header = document.getNamedElement("pen");
//вложенный элемент
node = header.getNamedElement("details");
    
...

Если элемент имеет внутри себя вложенные элементы в виде списка, то для упрощения обработки вложенных элементов можно использовать объект, представляющий собой коллекцию элементов, для обработки в цикле

XmlNodeList nodeList;
int         i;
    
...
//получаем коллекцию элементов    
nodeList = document.getElementsByTagName("detail");
while (i < nodeList.length())
{
    //получаем элемент из коллекции
    item = nodeList.item(i);
    ...
    i++;
}

Получить значение атрибута

item.getAttribute("name");

Получить значение элемента/тега

item.text();

 

Comments

So empty here ... leave a comment!

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

Sidebar