XML-файл можно импортировать в узел документа объектной модели документа (DOM) с помощью matlab.io.xml.dom.Parser объект или xmlread функция.
matlab.io.xml.dom.Parser класс принадлежит API MATLAB ® для обработки XML (MAXP). При использовании MAXPParser объект для чтения XML-файла, результирующий узел документа DOM представлен как matlab.io.xml.dom.Document объект. Список классов, которые можно использовать для работы с Document объект, см. matlab.io.xml.dom. Для использования классов MAXP программное обеспечение Java ® не требуется.
Для работы с объектом узла документа DOM, созданным xmlread, необходимо использовать Java API для обработки XML (JAXP). Список методов и свойств JAXP см. в разделе org.w3c.dom описание пакета по адресу https://docs.oracle.com/javase/7/docs/api.
В объектной модели документа каждый элемент XML-файла соответствует узлу. Свойства и методы, используемые для создания узлов и доступа к ним, соответствуют стандартам, установленным консорциумом World Wide Web.
Например, рассмотрим пример XML-файла:
<productinfo> <!-- This is a sample info.xml file. --> <list> <listitem> <label color="blue">Import Wizard</label> <callback>uiimport</callback> <icon>ApplicationIcon.GENERIC_GUI</icon> </listitem> <listitem> <label color="red">Profiler</label> <callback>profile viewer</callback> <icon>ApplicationIcon.PROFILER</icon> </listitem> </list> </productinfo>
Информация в файле сопоставляется со следующими типами узлов DOM:
Узлы элементов - соответствуют именам тегов. В info.xml , эти теги соответствуют узлам элементов:
productinfo
list
listitem
label
callback
icon
В этом случае list элемент является родителем listitem дочерние узлы элемента. productinfo элемент является корневым узлом элемента.
Текстовые узлы - содержат значения, связанные с узлами элементов. Каждый текстовый узел является дочерним для узла элемента. Например, Import Wizard текстовый узел является дочерним для первого label узел элемента.
Узлы атрибутов - содержат пары имен и значений, связанные с узлом элемента. Например, в первом label узел элемента, color является именем атрибута и blue - его ценность. Узлы атрибутов не являются родительскими или дочерними узлами.
Узлы комментариев - включить дополнительный текст в файл в форме <!--Sample comment-->.
Узлы документа - соответствуют всему файлу. Используйте методы узла документа для создания новых узлов элементов, текста, атрибутов или комментариев.
В этом примере используется matlab.io.xml.dom.Parser объект для чтения info.xml в файл в matlab.io.xml.dom.Document узел. Файл содержит несколько listitem элементы. Каждый listitem элемент содержит label и callback элемент. В примере используются методы MAXP для поиска текстового содержимого callback элемент, который соответствует label с текстовым содержимым Plot Tools.
Чтение файла в Document объект.
infoFile = fullfile(matlabroot,'toolbox/matlab/general/info.xml'); infoLabel = 'Plot Tools'; infoCbk = ''; itemFound = false; import matlab.io.xml.dom.* xDoc = parseFile(Parser,infoFile);
Найти все listitem путем вызова getElementsByTagName метод, который возвращает matlab.io.xml.dom.NodeList объект.
allListItems = getElementsByTagName(xDoc,'listitem');Для каждого listitem элемент, сравнить текст label элемент в Plot Tools. Когда вы найдете правильную метку, получите callback текст. Для доступа к элементу в NodeList объект, используйте node метод, в котором используется одноосновная индексация. Кроме того, можно использовать item метод, который использует индексацию на основе нуля.
length = allListItems.Length; for i=1:length thisListItem = node(allListItems,i); childNode = getFirstChild(thisListItem); while ~isempty(childNode) %Filter out text, comments, and processing instructions. if isa(childNode,'matlab.io.xml.dom.Element') %Assume that each element has a single Text child childText = getData(getFirstChild(childNode)); switch getTagName(childNode) case 'label' itemFound = strcmp(childText,infoLabel); case 'callback' infoCbk = childText; end end childNode = getNextSibling(childNode); end if itemFound break else infoCbk = ''; end end
Просмотрите результат.
fprintf('Item "%s" has a callback of "%s".\n', infoLabel,infoCbk);Item "Plot Tools" has a callback of "figure; plottools".
xmlreadВ этом примере используется xmlread чтобы прочитать info.xml в узел документа DOM и Java API для методов обработки XML, чтобы найти текстовое содержимое callback элемент, который соответствует label с текстовым содержимым Plot Tools.
infoFile = fullfile(matlabroot,'toolbox/matlab/general/info.xml'); infoLabel = 'Plot Tools'; infoCbk = ''; itemFound = false; xDoc = xmlread(infoFile); allListItems = getElementsByTagName(xDoc,'listitem'); %The item list index is zero-based. length = allListItems.getLength-1; for i=0:length thisListItem = item(allListItems,i); childNode = getFirstChild(thisListItem); while ~isempty(childNode) %Filter out text, comments, and processing instructions. if childNode.getNodeType == childNode.ELEMENT_NODE %Assume that each element has a single org.w3c.dom.Text child childText = char(childNode.getFirstChild.getData); switch char(childNode.getTagName) case 'label' itemFound = strcmp(childText,infoLabel); case 'callback' infoCbk = childText; end end childNode = getNextSibling(childNode); end if itemFound break else infoCbk = ''; end end fprintf('Item "%s" has a callback of "%s".\n', infoLabel,infoCbk);
Item "Plot Tools" has a callback of "figure; plottools".
matlab.io.xml.dom.Document | xmlread