按位置删除元素

remove element by position

我有一个 xml,它有一组简单的数据。 此数据以简单的 table 显示,并且根据 xml 中的位置为每一行数据分配一个 table 中的 ID(<xsl:value-of select="position()" />)。我无法为数据添加 id 属性,因为它不是我的数据,但我需要根据这个位置定位元素并删除它们。

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() {

}

}

此代码没有删除正确的数据。有人知道如何通过位置找到根元素的子元素吗?

@rolfl

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

这不会删除任何元素。

你这里的问题是进程正在获取要作为字符串删除的索引,然后调用 removeChild(String) 方法....查找元素标记名称为的第一个子项索引中的任何(字符串)值。

相反,您想要做的是将索引转换为 int,然后将根的子项视为列表....类似:

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

请参阅 getChildren() 的文档。

这就是我让它工作的方式。不确定它是否是一个很好的解决方案,但它确实有效。

        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;
            }               
        }

我得到了根元素

Element root = xml_document.getRootElement();

列出了它的子元素
List<Element> kids = root.getChildren();

然后遍历此列表,直到到达要删除的元素的索引,然后对该元素执行 .detach

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

如果有人可以更新此内容以显示更简单的删除元素的方法,请这样做。感觉必须有一种更简单的方法来分离元素而无需迭代。无论如何,正如我所说的那样有效。