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 elementolistitem
. El elementoproductinfo
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 elementolabel
.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 yblue
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
matlab.io.xml.dom.Document
| xmlread