按位置删除元素

时间:2017-11-22 22:21:09

标签: java xml xslt jdom-2

我有一个xml,它有一组简单的数据。 此数据显示在一个简单的表中,并根据xml中的位置为表中的每一行数据分配一个ID(Daily Summary: b'No precipitation throughout the week, with temperatures rising to 82\xc2\xb0F on Tuesday.' /> )。我无法为数据添加id属性,因为它不是我的数据,但我需要根据此位置定位元素并将其删除。

<xsl:value-of select="position()"

}

此代码不会删除正确的数据。任何人都知道如何根据其位置找到根元素的子元素?

@rolfl

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

}

这不会删除任何元素。

2 个答案:

答案 0 :(得分:1)

你的问题是,进程是将索引作为字符串删除,然后调用removeChild(String)方法....它查找具有元素标记名称的第一个子节点( string)值在索引中。

你想要做的是将索引转换为int,然后将root的子节点视为List ......如下所示:

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

请参阅getChildren()的文档。

答案 1 :(得分:0)

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

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

如果有人可以更新此内容以显示删除元素的更简单方法,请执行此操作。感觉就像必须有一种更简单的方法来分离元素而不进行迭代。无论如何,正如我说的那样有效。