使用removeContent()从JDOM文档中删除元素

时间:2011-04-12 10:47:00

标签: java xml jdom

鉴于以下场景,xml,Geography.xml看起来像 -

<Geography xmlns:ns="some valid namespace">
    <Country>
        <Region>
            <State>
                <City>
                    <Name></Name>
                    <Population></Population>
                </City>
            </State>
            </Region>
        </Country>
    </Geography>

以及以下示例java代码 -

InputStream is = new FileInputStream("C:\\Geography.xml");
SAXBuilder saxBuilder = new SAXBuilder();
Document doc = saxBuilder.build(is);

XPath xpath = XPath.newInstance("/*/Country/Region/State/City");
Element el = (Element) xpath.selectSingleNode(doc);
boolean b = doc.removeContent(el);

removeContent()方法不会从City的内容列表中删除元素doc。 b的值是false
我不明白为什么不删除元素,我甚至试图删除Name&amp;来自xml的Population元素只是为了看是否是问题,但显然不是。
我尝试的另一种方式,我不知道为什么我知道它本质上不同,仍然只是为了这个缘故,是使用Parent -

Parent p = el.getParent();
boolean s = p.removeContent(new Element("City"));

可能有什么问题?和可能的解决方案?如果有人可以分享方法removeContent()的真实行为,我怀疑它与父子关系有关。

3 个答案:

答案 0 :(得分:3)

当然,removeContent(Content child)如果孩子属于父母直系子女,则会移除孩子,而在您的情况下则不然。请改用el.detach()

答案 1 :(得分:2)

如果您要删除City元素,请获取其父级并致电removeContent

    XPath xpath = XPath.newInstance("/*/Country/Region/State/City");
    Element el = (Element) xpath.selectSingleNode(doc);
    el.getParent().removeContent(el);

doc.removeContent(el)不起作用的原因是因为el不是doc的孩子。

查看javadocs了解详情。那里有许多重载的removeContent方法。

答案 2 :(得分:0)

以这种方式工作时要牢记.getParent()返回一个Parent对象而不是Element对象,并且必须从Element中调用消除实际节点的detach()方法。

代替:

el.getParentElement().detach();

这将删除父元素及其所有子元素!