如何从java中删除XML中的子元素?

时间:2013-12-26 09:34:11

标签: java dom jdom jdom-2

我想从xml中删除子元素。
我的XML文件是

    <mcss>
        <quest ans="0"> 
            <question><![CDATA[ This is question one]]></question>
            <options>
                <option><![CDATA[B<Option one]]></option>
                <option><![CDATA[B<Option second]]></option>
                <option><![CDATA[B<Option three]]></option>
            </options>
            <explaination><![CDATA[explaination one]]></explaination>
        </quest>

        <quest ans="0"> 
            <question><![CDATA[ This is question two]]></question>
            <options>
                <option><![CDATA[B<Option one]]></option>
                <option><![CDATA[B<Option second]]></option>
                <option><![CDATA[B<Option three]]></option>
            </options>
            <explaination><![CDATA[explaination two]]></explaination>
        </quest>
</mcss>

如果我想首先删除问题该怎么办? 输出XML ..

    <?xml version="1.0" encoding="UTF-8"?>
    <mcss>
        <quest ans="0"> 
            <question><![CDATA[ This is question two]]></question>
            <options>
                <option><![CDATA[B<Option one]]></option>
                <option><![CDATA[B<Option second]]></option>
                <option><![CDATA[B<Option three]]></option>
            </options>
            <explaination><![CDATA[explaination two]]></explaination>
        </quest>
</mcss>

我的java代码删除问题一。

    String path="D://test//N2074_set2.xml";
            File structureXml = new File(path);
            SAXBuilder saxb = new SAXBuilder();
            Document document = saxb.build(structureXml);
            Element rootElement = document.getRootElement();
            XMLOutputter xmlOutput = new XMLOutputter();

            for (int i = 0; i < qestList.size(); i++) {
            Element quesList = (Element) qestList.get(2);
            if(quesList.getName().equalsIgnoreCase("quest"))
                rootElement.removeContent(2);

        }
FileOutputStream file=new FileOutputStream(path);

            xmlOutput.output(document, file);

3 个答案:

答案 0 :(得分:0)

您可以浏览每个question节点并匹配您要移除的愿望问题,如果匹配则可以删除它的父节点。

答案 1 :(得分:0)

我认为你错过了解决问题的简单方法。如果您有任何JDOM内容(元素,属性,文本等),则可以使用detach()方法将其从父项中删除。但是,在您的情况下,您可能希望使用Iterator遍历根节点的子元素,然后从迭代器中删除匹配的内容....:

for (Iterator<Element> questit = rootElement.getChildren("quest").iterator();
         questit.hasNext();) {
    if (" This is question one".equals(questit.next().getChildText("question")) {
         questit.remove();
    }
}

请注意,您不能在迭代器中使用detach(),因为这会导致ConcurrentModificationException。

答案 2 :(得分:0)

此代码首先删除问题。它的工作原理。

 Document document = saxb.build(structureXml);
                Element rootElement = document.getRootElement();
                XMLOutputter xmlOutput = new XMLOutputter();
                List qestList = rootElement.getChildren();
                Element quesList = (Element) qestList.get(0);
                if(quesList.getName().equalsIgnoreCase("quest")){
                    rootElement.removeContent(quesList);
                }
                FileOutputStream outputStream=new FileOutputStream(path);
                xmlOutput.output(document, outputStream);