2010-07-21 8 views
6

Estoy en una posición en la que uso Java para conectarme a un puerto TCP y descargo documentos XML uno tras otro, cada uno delimitado con el inicio <?xml de la etiqueta del documento Un ejemplo que demuestra el formato:Uso de SAX (Java) para analizar múltiples mensajes XML desde una única secuencia TCP

<?xml version="1.0"?> 
<person> 
    <name>Fred Bloggs</name> 
</person> 
<?xml version="1.0"?> 
<person> 
    <name>Peter Jones</name> 
</person> 

estoy usando la API org.xml.sax.*. El análisis SAX funciona perfectamente para el primer documento, pero se produce una excepción cuando se trata de todo el comienzo del segundo documento:

Exception in thread "main" org.xml.sax.SAXParseException: The processing instruction 
target matching "[xX][mM][lL]" is not allowed. 

La siguiente clase de esqueleto demuestra la configuración que estoy usando:

import org.xml.sax.InputSource; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 
import org.xml.sax.helpers.XMLReaderFactory; 

import java.io.FileReader; 

public class XMLTest extends DefaultHandler { 

    public XMLTest() { 
    super(); 
    } 

    public static void main(String[] args) throws Exception { 
    XMLReader xr = XMLReaderFactory.createXMLReader(); 

    XMLTest handler = new XMLTest(); 
    xr.setContentHandler(handler); 
    xr.setErrorHandler(handler); 

    xr.parse(new InputSource(new Socket("127.0.0.1", 4555).getInputStream())); 
    } 
} 

No tengo control sobre el formato del xml (es un feed de datos financieros), pero necesito poder analizarlo de manera eficiente y analizar todos los documentos. Pasé la tarde/noche probando cosas diferentes, pero ninguno arrojó resultados. Cualquier ayuda sería muy apreciada.

+0

Tiene que llamar al análisis sintáctico para cada documento separado, lo que significa que necesita filtrar y dividir el flujo de entrada en los caracteres '

+0

Tuve que hacer algo como esto y simplemente respondí (a mí) [aquí] (http://stackoverflow.com/questions/6711766/multiple-xml-files-in-one-stream/) envolviendo todo en su propio Reader para un uso más simple –

Respuesta

6

Desea dividir la secuencia en cada <?xml version="1.0"?> y analizarlos por separado. El BufferedReader puede ser útil en esto. Ejemplo de inicio:

reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
StringBuilder builder = null; 
for (String line; (line = reader.readLine()) != null;) { 
    if (line.startsWith("<?xml")) { 
     if (builder != null) { 
      xr.parse(new InputSource(builder.toString())); 
     } 
     builder = new StringBuilder(); 
    } 
    builder.append(line); 
} 
+0

Al hacer esto cuando 'input' es' InputStream input = new Socket ("127.0.0.1", 4500) .getInputStream(); 'Obtengo la siguiente excepción: Excepción en el hilo" main "java.io .FileNotFoundException:/Users/admin/IdeaProjects/XMLTest/<(Ningún archivo o directorio) en java.io.FileInputStream.open (Método nativo) en java.io.FileInputStream. (FileInputStream.java:106) en java.io.FileInputStream. (FileInputStream.java:66) Parece que a xr.parse() no le gustan las cadenas, incluso cuando está envuelto como un InputSource. – jkt

+0

¿Te consideras capaz de interpretar stacktraces? No veo cómo se relaciona 'FileNotFoundException' con todo esto. Yo diría que tu problema está en otra parte, tal vez en un paso más allá del análisis. En el mensaje de excepción dado nombre de archivo '/ Users/admin/IdeaProjects/XMLTest/<' no parece válido por cierto. Vuelva a leer la pila, rastree la ubicación correcta en el código que causó esto en función de los números de línea en la línea, establezca la causa raíz y corríjala. Si tiene dificultades y este problema no está relacionado con esta pregunta, formule una nueva pregunta (por ejemplo, "¿Cómo guardar un archivo XML?"). – BalusC

+0

Oye, Puedo leer stacktraces: solo pegué las primeras líneas. El puntero de stacktrace a mi código es 'en XMLTest.main (XMLTest.java:42)' y la línea 42 es: 'xr.parse (nuevo InputSource (builder.toString()));' (que es de su ejemplo anterior) . Aprecio tu ayuda con esto. – jkt

Cuestiones relacionadas