4

给定以下场景,其中 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()方法不会Citydoc. b 的值是false
我不明白为什么它不删除元素,我什至试图从 xml 中删除Name&Population元素只是为了看看这是否是问题,但显然不是。
我尝试的另一种方法,我不知道为什么我知道它没有本质上的不同,仍然只是为了使用Parent-

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

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

4

3 回答 3

4

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

于 2011-04-12T12:19:23.577 回答
4

如果要删除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方法。

于 2011-04-12T12:19:59.630 回答
0

这种方法的工作原理是记住 .getParent() 返回的是 Parent 对象而不是 Element 对象,并且必须从 Element 调用消除实际节点的 detach() 方法。

而是这样做:

el.getParentElement().detach();

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

于 2018-11-14T17:08:49.380 回答