最近在做esb项目的时候,有位同事使用dom4j去删除一段xml的一个org.dom4j.Element的namespace。是这样写的:
Element element = document.getRootElement();
Namespace namespace = new Namespace(prefix, uri);
element.remove(namespace);
这段代码很简单,就是删除一个namespace,可是就是删除不掉,那个remove方法有一个返回值,如果删除失败就会返回false,经过调试返回值一直是false。可是那个element确实有那么一个namespace,从这个element对象中可以获取里面的namespace对象,也能看到它的prefix和uri,确实没错!
其实dom4j内部也是使用的一个ArrayList,于是作了这么一个实验:
public class TestRemove {
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
list.add(new User("heyao",1));
list.add(new User("hefei",2));
boolean flag = list.remove(new User("heyao",1));
int i = list.size();
}
}
class User {
private String name ;
private int id;
public User(String name,int id) {
this.setName(name);
this.setId(id);
}
//省略setter getter
}
很明显,这样删除元素是不对的,这里的flag肯定也是false,于是我们再看一下ArrayList的实现:
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
注意,它是用的object的equals方法,所以,如果对象不是Java的原生对象的话,它比较的应该是内存地址。这也是我们在写一个对象时要重写equals方法的原因。
于是要删除那个namespace必须去查找到那个namespace对象,然后直接删除这个对象才能起作用。
有三个方法可以用:
element.getNamespace();
element.getNamespaceForPrefix(arg0)
element.getNamespaceForURI(arg0)
分享到:
相关推荐
对于未上传的文件,`beforeRemove`函数将直接返回`true`,跳过删除操作。 此外,文章还展示了`handleRemove`函数,这个函数用于处理实际的删除逻辑,当用户确认删除后,通过`$axios.delete`发送请求到服务器,删除...
`deep-remove`可能是一个工具或者方法,用于移除这些深度过深的选择器,从而提升页面加载速度和性能。 在`css-loader-deep-remove.zip`这个压缩包中,很可能是包含了一个示例项目或者一个自定义配置,用于演示如何...
2. 遍历数组,如果遇到需要删除的元素,就跳过它,不将其复制到结果数组中。 3. 最后,返回一个新的不包含待删除元素的数组。 使用"unordered-array-remove"库时,开发者只需要传入原始数组和需要移除的元素或元素...
在遍历`Set`时,如果要删除元素,必须在`next()`返回目标元素后立即调用`remove()`,并且在遍历过程中,一旦调用了`remove()`,后续的`next()`将跳过已被删除的元素。在上述代码中,对于`TreeSet`,删除"eee"应该在...
然而,有些程序,特别是像IntelliJ IDEA这样的集成开发环境(IDE),可能对含有BOM的UTF-8文件处理不理想,可能会导致解析错误或者显示异常。在某些情况下,如您描述的那样,批量移除文件的BOM格式变得必要。 要...
由于迭代器在列表中是按顺序前进的,当25被移除后,原本在索引2处的36移动到了索引1,而迭代器却跳过了索引1,直接检查索引2(现在是36),导致12未被检查到。 解决这个问题的方法是在遍历列表时,一旦删除元素,应...
"Remove Visited Link-crx插件"是一款专为浏览器设计的扩展程序,主要功能是帮助用户清理和管理他们的浏览历史,特别是已访问过的链接。这款插件特别适用于那些希望保护隐私或者想要保持浏览器界面整洁的用户。下面...
此脚本会读取每个待提交的文件,使用正则表达式筛选掉所有仅包含空格或制表符的注释行(以`#`开头),然后重新写入文件,跳过这些空注释行。最后,它将修改后的文件重新添加到Git暂存区。 使用这个预提交脚本,开发...
这样,你可以在一些项目中保持标准的GitHub工作流,而在其他项目中应用更严格的规则。这为团队提供了灵活性,可以根据项目的具体需求定制工作环境。 使用这个扩展程序的过程通常包括以下几个步骤: 1. 首先,你...
使用"Remove Amazon tag and ref links-crx插件",用户可以确保自己的浏览活动更加私密,同时减少由于链接过长导致的分享困难。 安装此插件非常简单,通常只需要通过浏览器的扩展管理界面,将"Remove_Amazon_tag_...
在附件上添加“从帖子中分离”链接,这样您就可以将其从帖子中删除而不删除文件。 安装 ,将存档重命名为wordpress-remove-post-attachment并像任何其他插件一样将其上传到您的网站。 也可。 兼容性 该插件已经过...
【YT - Remove viewed video from subscriptions-crx插件】是一款针对YouTube平台设计的浏览器扩展程序,专为英语用户打造。这款插件的主要功能是帮助用户从订阅列表中清理掉已观看过的视频,使得订阅源保持新鲜,...
在这个例子中,`data-big-src` 属性用于存储大图的URL,这样我们可以通过JavaScript获取到。 接下来,我们需要编写JavaScript代码来监听鼠标的滑过事件。这里可以使用`addEventListener`方法添加事件监听器: ```...
此外,C# 6.0引入了`RemoveAll()`方法,它可以一次性移除满足指定条件的所有元素,这样可以简化代码并提高性能: ```csharp List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; numbers.RemoveAll(n => n % 2 =...
通过这样的设计和实现,你可以创建一个能够递归删除指定目录及其所有内容的程序,同时尊重只读属性,避免不必要的数据丢失。然而,实际操作时务必谨慎,因为这种操作不可逆,可能会导致重要数据的永久删除。在执行...
这可能需要使用像jQuery这样的库来简化跨浏览器的JavaScript编程,或者使用autoprefixer处理CSS前缀,以确保老版本浏览器的支持。 最后,压缩包中的文件"map指定区域颜色及划过高亮"很可能包含了一个示例代码或者...
不要滥用此类工具去除他人的保护,除非你有合法的权利这样做。同时,为了防止个人信息泄露,应定期更新PDF阅读器和相关安全软件,以抵御潜在的PDF恶意攻击。 最后,了解PDF的基本安全设置和密码保护机制也是必要的...
为了提高性能,可以考虑使用事件委托,将事件监听器添加到父元素(如`<ul>`)而不是每个列表项,这样可以减少内存消耗和事件绑定的数量。 ```javascript const parent = document.querySelector('.TOPCN'); parent...
在JavaScript(JS)中,实现鼠标滑过图片时图片变半透明的效果,主要涉及到DOM操作、事件监听以及CSS样式修改。...通过熟练掌握JavaScript和CSS,你可以创建更多交互式的网页元素,提升用户界面的吸引力和易用性。
它通常出现在UTF-8编码的文件开头,由三个不可见的字节表示:0xEF, 0xBB, 0xBF。虽然BOM在某些情况下是有用...通过这样的方式,你可以批量处理整个目录下的所有文件,确保它们不含有BOM,从而避免因BOM引起的潜在问题。