Импорт XML-документов

Чтобы считать XML-файл из вашего локального диска или из URL, используйте функцию xmlread. xmlread возвращает содержимое файла в узле Объектной модели документа (DOM). Для получения дополнительной информации см.:

Что такое объектная модель XML-документов (DOM)?

В Объектной модели документа каждый элемент в XML-файле соответствует узлу. Свойства и методы для узлов DOM (то есть, путь вы создаете и узлы доступа) следуют нормам, установленным консорциумом Всемирной паутины.

Например, рассмотрите этот демонстрационный XML-файл:

<productinfo
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="https://www.mathworks.com/namespace/info/v1/info.xsd">

<!-- This is a sample info.xml file. -->

<list>

<listitem>
<label>Import Wizard</label>
<callback>uiimport</callback>
<icon>ApplicationIcon.GENERIC_GUI</icon>
</listitem>

<listitem>
<label>Profiler</label>
<callback>profile viewer</callback>
<icon>ApplicationIcon.PROFILER</icon>
</listitem>

</list>
</productinfo>

Информация в картах файлов к следующим типам узлов в DOM:

  • Узлы элемента — Соответствуют именам тега. В демонстрационном файле info.xml эти теги соответствуют узлам элемента:

    • product_info

    • list

    • listitem

    • метка

    • 'callback'

    • значок

    В этом случае элемент list является родительским элементом дочерних узлов элемента listitem. Элемент productinfo является корневым узлом элемента.

  • Текстовые узлы — Содержат значения, сопоставленные с узлами элемента. Каждый текстовый узел является дочерним элементом узла элемента. Например, текстовый узел Import Wizard является дочерним элементом первого узла элемента label.

  • Припишите узлы — Содержит имя и пары значения, сопоставленные с узлом элемента. Например, xmlns:xsi является именем атрибута, и http://www.w3.org/2001/XMLSchema-instance является своим значением. Узлы атрибута не являются родительскими элементами или дочерними элементами никаких узлов.

  • Прокомментируйте, что узлы — Включают дополнительный текст в файл в форму <!--Sample comment-->.

  • Узлы документа — Соответствуют целому файлу. Используйте методы на узле документа, чтобы создать новый элемент, текст, атрибут или узлы комментария.

Для полного списка методов и свойств узлов DOM, см. описание пакета org.w3c.dom в https://docs.oracle.com/javase/7/docs/api.

Пример - нахождение текста в XML-файле

Полный файл matlabroot/toolbox/matlab/general/info.xml содержит несколько элементов listitem, таких как:

<listitem>
<label>Import Wizard</label>
<callback>uiimport</callback>
<icon>ApplicationIcon.GENERIC_GUI</icon>
</listitem>

Один из элементов label имеет дочерний текст Plot Tools. Предположим, что вы хотите найти текст для элемента callback в том же listitem. Выполните эти шаги:

  1. Инициализируйте свои переменные и вызовите xmlread, чтобы получить узел документа:

    findLabel = 'Plot Tools';
    findCbk = '';
    
    xDoc = xmlread(fullfile(matlabroot, ...
                   'toolbox','matlab','general','info.xml'));
  2. Найдите все элементы listitem. Метод getElementsByTagName возвращает глубокий список, который содержит информацию о дочерних узлах:

    allListitems = xDoc.getElementsByTagName('listitem');

    Примечание

    Списки, возвращенные методами DOM, используют основанную на нуле индексацию.

  3. Для каждого listitem сравните текст для элемента label к тексту, который вы хотите найти. Когда вы определяете местоположение правильного label, получаете текст callback:

    for k = 0:allListitems.getLength-1
       thisListitem = allListitems.item(k);
       
       % Get the label element. In this file, each
       % listitem contains only one label.
       thisList = thisListitem.getElementsByTagName('label');
       thisElement = thisList.item(0);
    
       % Check whether this is the label you want.
       % The text is in the first child node.
       if strcmp(thisElement.getFirstChild.getData, findLabel)
           thisList = thisListitem.getElementsByTagName('callback');
           thisElement = thisList.item(0);
           findCbk = char(thisElement.getFirstChild.getData);
           break;
       end
       
    end
  4. Отобразите конечные результаты:

    if ~isempty(findCbk)
        msg = sprintf('Item "%s" has a callback of "%s."',...
                      findLabel, findCbk);
    else
        msg = sprintf('Did not find the "%s" item.', findLabel);
    end
    disp(msg);

Для дополнительного примера, который создает массив структур, чтобы хранить данные от XML-файла, смотрите страницу ссылки на функцию xmlread.

Была ли эта тема полезной?