Tengo un xml que tiene un conjunto simple de datos. Estos datos se muestran en una tabla simple y a cada fila de datos se le asigna un ID en la tabla según la posición en el xml (<xsl:value-of select="position()" />). No puedo agregar un atributo de identificación a los datos porque no son mis datos, pero necesito ubicar elementos basados ​​en esta posición y eliminarlos.

public class Delete extends HttpServlet {

private final String XML_FILE = "data.xml";

public void init() throws ServletException {

}

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Disable browser caching
    response.setHeader("Cache-Control", "private, no-store, no-cache, must-revalidate");
    response.setHeader("Pragma", "no-cache");
    response.setDateHeader("Expires", 0);

    String index = request.getParameter("delete");

    try {
        // Load the current data.xml
        SAXBuilder builder = new SAXBuilder();
        Document xml_document = builder.build(new File(getServletContext().getRealPath("/") + XML_FILE));

        Element root = xml_document.getRootElement();
        root.removeChild(index);


        XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
        outputter.output(xml_document, new FileWriter(getServletContext().getRealPath("/") + XML_FILE));
    }
    catch(Exception ex) {}

    // Once we have processed the input we were given
    // redirect the web browser to the main page.
    response.sendRedirect("/");
}

public void destroy() {

}

}

Este código no elimina los datos correctos. ¿Alguien sabe cómo encontrar al hijo del elemento raíz por su posición?

@rolfl

int index = Integer.parseInt(delete);
Element root = xml_document.getRootElement();
root.getChildren().remove(index);

Esto no elimina ningún elemento.

1
Finchy70 23 nov. 2017 a las 01:21

2 respuestas

La mejor respuesta

Así es como lo hice funcionar. No estoy seguro de si es una gran solución, pero funciona.

        SAXBuilder builder = new SAXBuilder();
        Document xml_document = builder.build(new File(getServletContext().getRealPath("/") + XML_FILE));

        // Get root element
        Element root = xml_document.getRootElement();

        // Create a list of the children of the root element
        List<Element> kids = root.getChildren();

        // Interate through list of elements and delete (detach) the element at position index.
        int i = 1;
        for (Element element : kids)
        {
            if(i == index)
            {
                element.detach();
                break;
            }
            else
            {
            i = i + 1;
            }               
        }

Tengo el elemento raíz con

Element root = xml_document.getRootElement();

Hizo una lista de sus elementos secundarios con

List<Element> kids = root.getChildren();

Luego, recorrí esta lista hasta que llegué al índice del elemento para eliminar y luego hice .detach en este elemento

            int i = 1;
            for (Element element : kids)
            {
                if(i == index)
                {
                    element.detach();
                    break;
                }
                else
                {
                i = i + 1;
                }               
            }

Si alguien puede actualizar esto para mostrar una forma más fácil de eliminar el elemento, hágalo. Parece que debe haber una forma más fácil de separar un elemento sin la iteración. De todos modos, como dije, funciona.

0
Finchy70 28 nov. 2017 a las 13:24

Su problema aquí es que el proceso hace que el índice se elimine como una cadena, y luego se llama al método removeChild(String) ... que busca el primer hijo que tiene un nombre de etiqueta de elemento de cualquier valor (cadena) está en el índice.

Lo que quiere hacer, en cambio, es convertir el índice en un int, y luego tratar a los hijos de la raíz como una Lista ... algo como:

int index = Integer.parseInt(request.getParameter("delete"));
root.getChildren().remove(index);

Consulte la documentación de getChildren().

1
rolfl 22 nov. 2017 a las 23:44