Main Content

Importar un archivo XML a un Document Object Model

Puede importar un archivo XML a un nodo de documento Document Object Model (DOM) mediante un objeto matlab.io.xml.dom.Parser o la función xmlread.

La clase matlab.io.xml.dom.Parser pertenece a la API de MATLAB® para el procesamiento de XML (MAXP). Si utiliza un objeto Parser de MAXP para leer un archivo XML, el nodo de documento DOM resultante se representa como un objeto matlab.io.xml.dom.Document. Para obtener una lista de las clases que puede utilizar para trabajar con un objeto Document, consulte matlab.io.xml.dom. No es necesario el software Java® para utilizar las clases de MAXP.

Para trabajar con un objeto de nodo de documento DOM creado por xmlread, debe utilizar la API de Java para el procesamiento de XML (JAXP). Para obtener una lista de los métodos y las propiedades de JAXP, consulte la descripción del paquete org.w3c.dom en https://docs.oracle.com/javase/7/docs/api.

El Document Object Model XML

En un Document Object Model, cada elemento de un archivo XML corresponde a un nodo. Las propiedades y los métodos que utiliza para crear los nodos y acceder a ellos siguen las normas establecidas por el consorcio de la World Wide Web.

Por ejemplo, considere este archivo XML de muestra:

<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>

La información del archivo se aplica a los siguientes tipos de nodos DOM:

  • Nodos de elemento: corresponden a los nombres de las etiquetas. En el archivo info.xml, estas etiquetas corresponden a los nodos de elemento:

    • productinfo

    • list

    • listitem

    • label

    • callback

    • icon

    En este caso, el elemento list es el nodo principal de los nodos secundarios de elemento listitem. El elemento productinfo es el nodo de elemento raíz.

  • Nodos de texto: contienen valores asociados a los nodos de elemento. Cada nodo de texto es el nodo secundario de un nodo de elemento. Por ejemplo, el nodo de texto Import Wizard es el nodo secundario del primer nodo de elemento label.

  • Nodos de atributo: contienen pares nombre-valor asociados a un nodo de elemento. Por ejemplo, en el primer nodo de elemento label, color es el nombre de un atributo y blue es su valor. Los nodos de atributo no son nodos ni principales ni secundarios de otros nodos.

  • Nodos de comentario: incluyen texto adicional en el archivo, en el formato <!--Sample comment-->.

  • Nodos de documento: corresponden al archivo completo. Utilice métodos en el nodo de documento para crear nuevos nodos de elemento, texto, atributo o comentario.

Leer un archivo XML con el analizador de MAXP

En este ejemplo se utiliza un objeto matlab.io.xml.dom.Parser para leer un archivo info.xml en un nodo matlab.io.xml.dom.Document. El archivo contiene varios elementos listitem. Cada elemento listitem contiene los elementos label y callback. En este ejemplo se utilizan los métodos de MAXP para encontrar el contenido de texto del elemento callback que se corresponde con el elemento label con el contenido de texto Plot Tools.

Lea el archivo en un objeto Document.

infoFile = fullfile(matlabroot,'toolbox/matlab/general/info.xml');
infoLabel = 'Plot Tools';
infoCbk = '';
itemFound = false;

import matlab.io.xml.dom.*
xDoc = parseFile(Parser,infoFile);

Encuentre todos los elementos listitem llamando al método getElementsByTagName, que devuelve un objeto matlab.io.xml.dom.NodeList.

allListItems = getElementsByTagName(xDoc,'listitem');

En cada elemento listitem, compare el texto del elemento label con Plot Tools. Cuando localice la etiqueta correcta, obtenga el texto callback. Para acceder a un elemento del objeto NodeList, utilice el método node, que utiliza la indexación de base uno. También puede utilizar el método item, que utiliza la indexación de base cero.

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

Muestre el resultado.

fprintf('Item "%s" has a callback of "%s".\n', infoLabel,infoCbk);
Item "Plot Tools" has a callback of "figure; plottools".

Leer un archivo XML con xmlread

En este ejemplo se utiliza xmlread para leer el archivo info.xml en un nodo de documento DOM y la API de Java para que los métodos de procesamiento de XML encuentren el contenido de texto del elemento callback que se corresponde con el elemento label con el contenido de texto 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".

Consulte también

|

Temas relacionados

Sitios web externos