Работа с файлами в формате XML | Все о ремонте и настройке компьютера

Примеры работы с XML-файлами

Рассмотрим несколько простых примеров по работе с XML-файлами с использованием сборки XML языка Fore.

Загрузка XML-файла

Для загрузки XML-файла необходимо:

  1. Инициализировать объект одного из доступных классов: DOMDocument, DOMDocument40, DOMDocument60, FreeThreadedDOMDocument, FreeThreadedDOMDocument60.

    Работа с xml файлами

    Первые три класса позволяют работать с различными версиями MSXML (3.0, 4.0, и 6.0 соответственно). Последние два класса используются, если осуществляется разработка приложения, в котором предусмотрен многопоточный доступ к одним и тем же данным.

  2. Полученный объект может быть приведен к одному из следующих интерфейсов: IXmlDomDocument, IXmlDomDocument2, IXmlDomDocument3. IXmlDomDocument — содержит базовые свойства и методы для работы с XML-структурами; IXmlDomDocument2 — расширение интерфейса IXmlDomDocument, которое поддерживает схемы кэширования и функции проверки, включая поддержку XPath-выражений; IXmlDomDocument3 — продолжение IXmlDomDocument2 с двумя новыми методами importNode и validateNode.

  3. Используя метод load или loadXML интерфейса IXmlDomDocument (описание методов представлено в MSDN), можно загрузить XML-документ, с которым в дальнейшем будет осуществляться работа.

Sub Sample1;
Var
    XMLDoc: IXMLDOMDocument;
    XMLName: String = "c:\Data.xml";
    Loaded: Boolean;
Begin
    XMLDoc := New DOMDocument.Create;
    Loaded := XMLDoc.load(XMLName);
    If Loaded Then
        //Дальнейшая работа с загруженным документом
        //…
        XMLDoc.save(XMLName);
    End If;
End Sub Sample1;

Sub Sample2(strXML: String);
Var
    XMLDoc: IXMLDOMDocument3;
    Loaded: Boolean;
Begin
    XMLDoc := New DOMDocument60.Create;
    Loaded := XMLDoc.loadXML(strXML);
    If Loaded Then
        //Дальнейшая работа с загруженным документом
    End If;
End Sub Sample2;

Работа с вершинами

Для получения необходимых вершин используйте соответствующие свойства и методы интерфейса IXmlDomDocument:

Sub Sample3;
Var
    XMLDoc: IXMLDOMDocument;
    Loaded: Boolean;
    Nodes: IXmlDomNodeList;
    Node, NewNode: IXmlDomNode;
    NewAttr: IXmlDomAttribute;
Begin
    //Загрузка документа
    //…
    If Loaded Then
        //Корневая вершина
        Node := XMLDOc.documentElement;
        //Получение вершин, дочерних для корневой вершины
        Nodes := Node.childNodes;
        //Получение необходимых вершин в соответствии с XPath-запросом
        Nodes := XMLDOc.selectNodes("<XPath-запрос для отбора вершин>");
        //Новая вершина
        NewNode := XMLDOc.createNode("element", "Comments", "");
        //Новый атрибут для вершины
        NewAttr := XMLDOc.createAttribute("text");
        NewAttr.value := "Comment…";
        NewNode.attributes.setNamedItem(NewAttr);
        //Добавление созданной вершины в дерево
        Node.appendChild(NewNode);
        //Получение необходимой вершины в соответствии с XPath-запросом
        Node := XMLDOc.selectSingleNode("<XPath-запрос для отбора вершины>");
        //…
End Sub Sample3;

Дополнительно

Ниже приведены различные примеры работы с XML-файлами:

См. также:

Сборка XML

PHP — очень интересный язык программирования, предоставляющий массу возможностей, что называется, прямо из коробки. В последних версиях PHP (начиная с 5.1) в стандартную поставку вошел класс , предназначенный для чтения файлов XML. В принципе, объект-то достаточно понятный, однако я столкнулся с одной неприятной особенностью, что и побудило меня написать данную статью. Но обо всем по порядку.

Итак, создаем объект класса :

$reader = new XMLReader();

Далее нужно открыть файл. Для этого существуют два метода: и . Следуя букве описания языка, первый метод предназначен для открытия XML-файлов, а второй — для передачи XML-содержимого в виде строки. Однако довольно часто второй метод используется и для открытия файлов. Воспользуемся, например, :

if (!$reader->open(‘http://example.com/example.xml’) { die(‘Не удалось открыть файл’); }

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

Теперь, собственно, переходим к разбору. Во-первых, если есть схема документа, то можно сразу же проверить его на соответствие схеме. Первый вариант — это когда в соответствии с полным стандартом XML схема указана в заголовке XML-файла. Тогда валидацию можно произвести так:

$reader->setParserProperty(XMLReader::VALIDATE, true); if (!$reader->isValid()) { die(‘Неправильный XML’); }

Подобный код нужно вызывать после открытия документа (методом Open или XML), но до первого считывания (методом Read).

Другой вариант — это воспользоваться форматом описания схем RELAX NG, особенно если XML-документ достаточно простой. Тем более что такую схему можно описать в виде строки прямо в php-скрипте — необязательно иметь ее в виде файла. К сожалению, более-менее внятной спецификации Relax NG на русском языке я с ходу не нашел, пожалуй, можно обратиться к широко рекламируемым в последнее время пособиям от IBM, в частности к статье Валидация XML-документов. В этом случае для установки схемы Relax NG используются методы , если схема сохранена в виде файла, и , если схема передается в виде строки.

Теперь самое время приступить к чтению. В общем-то, в самом общем виде это цикл . Если же быть чуть более конкретным, то у нас будет серия вложенных циклов, в которых мы будем смотреть на текущий так называемый тип узла (node) и его имя, и, в зависимости от этого, предпринимать какие-либо действия, например, открывать вложенный цикл. И так далее. Также мне представляется удобным сформировать из содержимого XML-файла ассоциативный массив, с которым потом и работать после считывания. Это, по идее, уменьшает вероятность ошибок и увеличивает гарантию того, что XML мы считали правильно.

Что же касается типов узлов, то их довольно много, наиболее важные из них:

  • — начало элемента ()
  • — атрибут элемента ()
  • — конец элемента ()
  • — содержимое элемента (в общем-то, это существенная часть между и , хотя в этой области также обитают, например — незначащие пробелы — и т.п.)

Итак, набросок кода цикла по XML файлу:

$xmlarr = array(); $idx = 0; while ($reader->read()) { if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element1’)) { // считываем атрибуты $xmlarr[$idx][‘Attr1’] = $reader->getAttribute(‘Attr1’); while ($reader->read()) { // разбираем вложенные элементы if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element11’)) { while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) { // получаем значение из свойства $reader->value; $xmlarr[$idx][$reader->name] = $reader->value; } elseif (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element111’)) { // еще один вложенный элемент while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) /* и т.д. */ { $xmlarr[$idx][‘Element11’][$reader->name] = $reader->value; } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == ‘Element111’)) { break; } } } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == ‘Element11’)) { break; } } } elseif (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element12’)) { while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) { // … = $reader->value; } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == ‘Element12’)) { break; } } } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == ‘Element1’)) { $idx += 1; break; } } } }

Итак, мы пользовались такими свойствами, как (тип узла), (наименование узла) и (значение), а также методом getAttribute для получения значения атрибута по заранее известному имени.

Самый стандартный и простой способ записи данных в xml файл из c#

Если же атрибуты заранее неизвестны, то тогда по аналогии открывается вложенный цикл с проверкой . В общем-то, здесь самое сложное не запутаться во вложенных циклах

А теперь, та самая неприятная особенность, с которой я столкнулся и из-за которой, в немалой степени, я и засел за написание данной статьи. Дело в том, что при использовании самозакрывающихся элементов (например, ), в отличие, например, от парсера, который использует 1С: Предприятие 8 (видимо, какую-то Windows-библиотеку), не распознает /> как . Так что мой совет — избегать подобного рода самозакрывающиеся элементы. Хотя я и не отрицаю возможности, что у меня были устаревшие библиотеки PHP (в частности libxml), поэтому в последних версиях, возможно, эта ошибка (я склонен все-таки считать эту особенность именно ошибкой) исправлена.

Ну что ж, надеюсь, данной статьей я, так сказать, ввел вас в курс дела, ну а для более серьезного изучения вопроса я, пожалуй, снова сошлюсь на IBM-овское пособие — Синтаксический анализ XML в PHP, однако нужно иметь в виду, что та статья довольно-таки обширная, и там рассматривается данный вопрос с точки зрения организации AJAX.

P.S. Не забудьте закрыть XML-файл

$reader->close();

Замечания и предложения

На старой версии сайта к статье поступили такие замечания и предложения.

Mrb: решение для этой проблемы следующее:

if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element11’) && !$reader->isEmptyElement) { //код… }

В этом случае скрипт будет проверять не является ли элемент пустым, то бишь самозакрывающимся.

Виталий

reader->open(‘http://example.com/example.xml’, NULL, LIBXML_NOEMPTYTAG);

Вот и всё решение проблемы.
(integer) — разворачивать пустые тэги (например <br/> в <br></br>).

Категория: Программирование, 1С | Опубликовано 03.05.2009 | Редакция от 15.01.2017

Похожие материалы:


Все большее число web сервисов возвращает данные в формате JSON, но до сих пор огромное количество данных возвращается в формате XML.

Расширение PHP — SimpleXML, которое был введено еще в PHP 5.0, очень сильно упростило парсинг XML. Давайте посмотрим на сколько это просто.

ИСПОЛЬЗОВАНИЕ

Возмем небольшой XML файл:

<?xml version="1.0" encoding="utf-8"?> <languages> <lang name="C"> <appeared>1972</appeared> <creator>Dennis Ritchie</creator> </lang> <lang name="PHP"> <appeared>1995</appeared> <creator>Rasmus Lerdorf</creator> </lang> <lang name="Java"> <appeared>1995</appeared> <creator>James Gosling</creator> </lang> </languages>

Данный файл описывает 3 языка программирования. У каждого языка есть свой автор (creator) и год разработки (appeared)

Первым делом загрузим наш .xml файл с помощью функции simplexml_load_file() или simplexml_load_string(). Далее к этому файлу мы будем обращаться через переменную $languages

<?php $languages = simplexml_load_file("languages.xml");

Обе функции читают DOM дерево и возвращают SimpleXMLElement объект, который будет храниться в переменной $language.

Используя функцию var_dump() или print_r() мы получим подробную информацию о возвращенном объекте.

SimpleXMLElement Object ( [lang] => Array ( [0] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => C ) [appeared] => 1972 [creator] => Dennis Ritchie ) [1] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => PHP ) [appeared] => 1995 [creator] => Rasmus Lerdorf ) [2] => SimpleXMLElement Object ( [@attributes] => Array ( [name] => Java ) [appeared] => 1995 [creator] => James Gosling ) ) )

В XML содержится три lang элемента, поэтому SimpleXMLElement состоит из массива 3-х элементов lang.

 

ОБРАЩЕНИЕ К ЭЛЕМЕНТАМ

Вы можете получить доступ к каждому элементу обычным путем, используя оператор ->.

Для примера: $language->lang[0] выдаст первый lang элемент.

Работаем с XML

Элемент будет содержать 2 свойства: appeared и creator.

<?php $languages->lang[0]->appeared; $languages->lang[0]->creator;

С помощью цикла foreach можно пройти по всем языкам в документе. Для этого напишем код:

<?php foreach ($languages->lang as $lang) { printf( "<p>%s appeared in %d and was created by %s.</p>", $lang["name"], $lang->appeared, $lang->creator ); }

Обратите внимание, что здесь используется запись:

$lang["name"]

С помощью таких записей мы можем обращаться к атрибутам элементов.

 

В данной статье приведена основная информация о работе с SimpleXML.

Более детально читайте здесь: 

Оригинал статьи

 

Автор статьи: Alex. Категория: PHP
Дата публикации: 03.03.2013

.

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

Закрыть меню