read parse manage example ejemplo java xml xml-parsing sax saxparser

java - parse - SAX que usa mĂșltiples extensiones de DefaultHandler



sax xml java example (1)

El problema que estoy teniendo es que quiero analizar 1 documento XML utilizando extensiones de la clase SAX defaultHandler. Cuando uso solo un manejador, puedo analizar XML y asignar diferentes etiquetas a las propiedades de un objeto (ver dominio y área). Una vez que los tengo en el objeto de dominio y área, quiero agregarlos a otro objeto (GroupedFiles) que tiene una lista de dominios y áreas. El problema que estoy teniendo es analizar 1 documento usando 2 manejadores. Mi teoría, aunque no es la mejor práctica de codificación, es analizar el documento dos veces, ejecutarlo una vez usando el controlador de dominio, establecer los dominios, luego agregar a los archivos agrupados, y luego hacer lo mismo para el área. Aquí está el código,

GroupedFiles groupedFiles = new GroupedFiles(); ArrayList<Domain> domains = new ArrayList<Domain>(); ArrayList<Area> areas = new ArrayList<Area>(); //Create parser from factory XMLReader parser = XMLReaderFactory.createXMLReader(); //Creates an input stream from the file "someFile.xml" InputStream in = new FileInputStream(new File("someFile.xml")); InputSource source = new InputSource(in); //Create handler instances DomainHandler domainHandler = new DomainHandler(); AreaHandler areaHandler = new AreaHandler(); //Parses out XML from a document using each handler, //adding it to an object with the correct properties then adds those //to another object which features Lists of Domains, Areas, and Directories. parser.setContentHandler(domainHandler); parser.parse(source); domains = domainHandler.getXML(); groupedFiles.setDomain(domains); parser.setContentHandler(areaHandler); parser.parse(source); areas = areaHandler.getXML(); groupedFiles.setArea(areas);

Sin embargo, no puedo, y parece colgar en el segundo parser.parse(source) . Si miro los archivos agrupados después de ejecutar, el dominio se completa pero las áreas no. ¿Algún consejo?


No es necesario realizar varias pasadas, puede intercambiar controladores de contenido durante el proceso de análisis. XMLReader tiene un método setContentHandler que puede llamar para pasar un nuevo controlador. Por ejemplo, puede establecer un nuevo controlador de contenido si en startElement reconoce una etiqueta que comienza un área cubierta por un controlador diferente, o si está abandonando el elemento en endElement y desea volver a un controlador de contenido anterior.

Para ver ejemplos, consulte este artículo de JavaWorld o revise esta respuesta .