XML - manejo de varias lineas en XML

 
Vista:

manejo de varias lineas en XML

Publicado por carlos eduardo (1 intervención) el 30/10/2005 00:14:07
Hola
tengo el siguiente problema al leer un archivo .XML que posea tags de la siguiente manera
<puntos>
1 2 3
5 4 5
7 8 9
</puntos>
Trabajo en java con la API SAX, he tratado de leer el tag de arriba usando el metodo characters... pero tengo problemas con los fin de linea, alguien sabe como debe manejarse esto ? ya que lo que necesito es leer cada linea e insertarla, por ejemplo, en un vector, segun el ejemplo entonces tendria un vector de strings pero de tres posiciones, en cada posicion, un string de la forma "1 2 3".
Puede alguien colaborarme con esto ? de antemano muchas gracias
Carlos E.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Lectura de contenido con saltos de línea usando SAX en Java

Publicado por Alejandro (258 intervenciones) el 12/07/2023 17:04:58
Cuando estás utilizando el parser SAX en Java para leer contenido XML con saltos de línea, el método `characters()` no se invocará para cada línea individualmente. En su lugar, se invocará una sola vez para todo el contenido dentro del elemento `<puntos>`.

Para lograr tu objetivo de leer cada línea e insertarla en un vector de strings, puedes utilizar una combinación de eventos SAX y manipulación de cadenas. Aquí tienes una solución:

1. Crea una clase que implemente la interfaz `ContentHandler` de SAX y sobrescribe los métodos necesarios. Por ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
 
import java.util.ArrayList;
import java.util.List;
 
public class MyContentHandler implements ContentHandler {
    private List<String> lineList;
    private StringBuilder currentLine;
 
    public MyContentHandler() {
        lineList = new ArrayList<>();
        currentLine = new StringBuilder();
    }
 
    public List<String> getLineList() {
        return lineList;
    }
 
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        currentLine.append(new String(ch, start, length));
    }
 
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("puntos".equals(qName)) {
            String[] lines = currentLine.toString().trim().split("\\r?\\n");
            for (String line : lines) {
                lineList.add(line.trim());
            }
            currentLine.setLength(0);
        }
    }
 
    // Implementa los demás métodos de la interfaz ContentHandler (startElement, endDocument, etc.) según tus necesidades
}

2. Utiliza la clase `XMLReader` junto con tu `ContentHandler` personalizado para realizar el análisis del XML. Aquí tienes un ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
 
import java.io.FileReader;
 
public class XMLParser {
    public static void main(String[] args) {
        try {
            XMLReader xmlReader = XMLReaderFactory.createXMLReader();
            MyContentHandler contentHandler = new MyContentHandler();
            xmlReader.setContentHandler(contentHandler);
 
            FileReader fileReader = new FileReader("ruta/al/archivo.xml");
            InputSource inputSource = new InputSource(fileReader);
            xmlReader.parse(inputSource);
 
            // Obtén el vector de strings con las líneas leídas
            List<String> lineList = contentHandler.getLineList();
            for (String line : lineList) {
                System.out.println(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Asegúrate de reemplazar "ruta/al/archivo.xml" con la ruta y nombre de tu archivo XML.

La clase `MyContentHandler` implementa `ContentHandler` y se encarga de almacenar cada línea dentro del elemento `<puntos>` en una lista de strings. El método `endElement()` se invoca al finalizar el elemento `<puntos>`, y allí se procesan las líneas almacenadas en `currentLine` y se agregan al vector de strings `lineList`.

La clase `XMLParser` crea el `XMLReader` y lo configura con el `ContentHandler` personalizado. Luego, se realiza el análisis del XML y se obtiene el vector de strings con las líneas leídas.

Espero que esta solución te ayude a leer correctamente las líneas con saltos de línea dentro del elemento `<puntos>` en tu archivo XML utilizando SAX en Java.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar