0

我想从 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);
4

3 回答 3

0

我认为您错过了解决问题的简单方法。detach()如果您有任何 JDOM 内容(元素、属性、文本等),您可以使用该方法将其从其父级中删除。但是,在您的情况下,您可能希望使用 Iterator 来遍历根节点的子元素,然后从 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。

于 2013-12-26T13:32:04.963 回答
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);
于 2013-12-26T13:36:06.587 回答
0

您可以遍历每个question节点并匹配要删除的所需问题,如果匹配,则可以删除它的父节点。

于 2013-12-26T09:43:04.343 回答