2012-02-28 14 views
7

Necesito analizar una cadena XML con MATLAB (precaución: sin E/S de archivos, así que no quiero escribir la cadena en un archivo y luego leerlos). Recibo las cadenas de una conexión HTTP y el análisis debe ser muy rápido. Lo que más me preocupa es leer los valores de ciertas etiquetas en toda la cadenaAnálisis de cadenas XML en MATLAB

La red está llena de amenazas de muerte sobre el análisis XML con expresiones regulares, así que no quería entrar en eso todavía. Sé que MATLAB tiene una integración perfecta de Java, pero no soy muy conocedor de Java. ¿Hay una manera rápida de obtener ciertos valores de XML muy rápidamente?

Por ejemplo, quiero obtener la información de 'volumen' de esta cadena a continuación y escribir esto en una variable.

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 


<root> 
    <volume>256</volume> 
    <length>0</length> 
    <time>0</time> 
    <state>stop</state> 
    .... 
+0

¿Estás usando Windows? Si es así, entonces puedo ofrecerte una solución .NET. –

Respuesta

1

Hay toda una class of functions para tratar con XML, incluyendo xmlread y xmlwrite. Esos deberían ser bastante útiles para su problema.

+2

Pero sí dijo explícitamente que no quiere tratar con archivos –

7

Por lo que vale la pena, a continuación se muestra el código ejecutable de Java Matlab para realizar la tarea requerida, sin necesidad de escribir a un archivo intermedio:

%An XML formatted string 
strXml = [... 
    '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>' char(10)... 
    '<root>' char(10) ... 
    ' <volume>256</volume>' char(10) ... 
    ' <length>0</length>' char(10) ... 
    ' <time>0</time>' char(10) ... 
    ' <state>stop</state>' char(10) ... 
    '</root>' ]; 

%"simple" java code to create a document from said string 
xmlDocument = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder.parse(java.io.StringBufferInputStream(strXml)); 

%"intuitive" methods to explore the xmlDocument 
nodeList = xmlDocument.getElementsByTagName('volume'); 
numberOfNodes = nodeList.getLength(); 

firstNode = nodeList.item(0); 
firstNodeContent = firstNode.getTextContent; 

disp(firstNodeContent); %Returns '256' 

Como alternativa, si la aplicación lo permite, considere pasando la URL directamente a su analizador XML. El código java no probado está debajo, pero eso probablemente también abra la función incorporada Matlab xslt también.

xmlDocument = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder.parse('URL_AS_A_STRING_HERE'); 

Documentación here. Comience en el paquete "javax.xml.parsers".

1

No estoy familiarizado con las API de Matlab en absoluto, pero señalaría que usar el método DOM descrito por Pursuit requerirá más tiempo/memoria si solo quiere valores específicos de la secuencia XML que está recuperando la conexión HTTP.

Si bien STAX le dará el enfoque de análisis más rápido en Java, usar la API puede ser difícil de manejar, especialmente si no está familiarizado con Java. Puede usar SJXP que es una abstracción extremadamente delgada ontop de STAX en Java (descargo de responsabilidad: soy el autor) que le permite definir rutas a los elementos que desea, luego le da al analizador una secuencia (su flujo HTTP en este caso)) y saca todos los valores por ti.

A modo de ejemplo, digamos que usted quería los valores/root/estado y/root/volumen fuera del XML ejemplos informados, Java real sería algo como esto:

// Create /root/state rule 
IRule stateRule = new DefaultRule(Type.CHARACTER, "/root/state") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     System.out.println("State is: " + text); 
    } 
} 

// Create /root/volume rule 
IRule volRule = new DefaultRule(Type.CHARACTER, "/state/volume") { 
    @Override 
    public void handleParsedCharacters(XMLParser parser, String text, Object userObject) { 
     System.out.println("Volume is: " + text); 
    } 
} 

// Create the parser with the given rules 
XMLParser parser = new XMLParser(stateRule, volRule); 

Usted puede hacer todos los que la inicialización de programa de inicio entonces en algún momento más tarde, cuando se va a procesar el flujo de su conexión HTTP, que haría algo como:

parser.parser(httpConnection.getOutputStream()); 

o similares; luego, se llamará a todo el código del controlador que definió en sus reglas a medida que el analizador se ejecute a través de la secuencia de caracteres de la conexión HTTP.

Como mencioné, no estoy familiarizado con Matlab y no conozco las formas adecuadas de "Matlab-i-fy" este código, pero parece que, desde el primer ejemplo, puede usar más o menos las API de Java directamente, en cuyo caso, esta solución será más rápida y usará significativamente menos memoria para el análisis si es importante que el enfoque DOM.