Работа с 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!