`
swanky_yao
  • 浏览: 30782 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

你这样remove过吗

XML 
阅读更多
最近在做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)
2
0
分享到:
评论

相关推荐

    remove-post-attachment:WordPress.org 插件镜像

    在附件上添加“从帖子中分离”链接,这样您就可以将其从帖子中删除而不删除文件。 安装 ,将存档重命名为wordpress-remove-post-attachment并像任何其他插件一样将其上传到您的网站。 也可。 兼容性 该插件已经过...

    api_through_ui

    你为什么需要它? 我的朋友们,您曾经记录过REST API吗? 如果这样做的话,过程很可能如下所示: cURL an API Endpoint -&gt; Repeat until it works Copy the URL, headers, request and response body -&gt; Paste ...

    hack:砍死你的朋友!

    哈克 这个专案可协助您骇客。 您需要做的就是等待他们将计算机解锁,打开终端,然后运行一个curl命令。 或者直接在下面跳转。 入门 克隆,安装和链接,以便可以使用hack ... 这样,服务器可以将根URL注入到Shell脚本中

    HTML--实现下雪效果.zip

    我们要实现的下雪效果完成了,如果运行时间过长可能会导致内存占用过多造成卡顿现象,可以将html代码中的最后一段注释里的内容取消注释,这样到下面的积雪就会慢慢淡出并且remove删除了,不过我觉得积雪也挺好看的,就没...

    EXCEL--实用技巧

    2.按ctrl+c+c 键,打开剪贴板,就可以管理并使用以前复制过的信息(use the keyboard shortcut Ctrl+C+C to open the Task Pane dialog box, which contains the copied ranges (up to 24) that have been saved to ...

    python 删除列表里所有空格项的方法总结

    首先,我们来随便写一个带空格的列表: ...但是结果你会发现是这样的,它总是不能完全的删完空格,会在末尾留下一个。 方法一: 这个时候,可以尝试把‘==’改为in: # -*- coding:utf-8 -*- for i in list1: if ' '

    郁金香vc过驱动保护

    郁金香VC++过驱动保护全套 免key版 天異赤提供 教程下载地址获取方法: 第一步:打开下方链接,填写QQ邮箱,系统会往QQ邮箱发一封确认订阅邮件 第二步:打开QQ邮箱查看邮件,确认订阅,订阅成功后系统会自动把下载地址和...

    leetcode叫数-leetcode:leetcode

    基本上这个算法类似冒泡算法,因为已经是排序过的,只要做一个循环,把上一次的值存下来,如果相同说明重复,如果不同,那么根据自己计数的index赋值到对应位置,最后返回counter 27. Remove Element 这题用ruby简直...

    云服务器安装mysql

    1.查看是否有安装过mysql rpm -qa | grep -i mysql 2、 删除mysql 2.1、如果有了mysql,但是想要删除mysql yum -y remove MySQL-* 注:一般用rpm -e 的命令删除mysql,这样表面上删除了mysql,可是mysql的一些...

    centOS7安装MySQL数据库

    # rpm -qa|grep mysql 查看有哪些安装包,如果直接跳过,说明没有安装包,记忆可以直接进入第2、3 # yum remove mysql mysql-server mysql-libs compat-mysql51 注意这个代码,卸载不干净 # rm -rf /var/lib/mysql...

    zook:Apache ZooKeeper的命令行工具

    该命令应该像下面这样简单: $ zook exists --path /zookeeper/quota 这将检查给定路径/zookeeper/quota的zookeeper节点是否存在。 Zook构建在之上,并且该模块指出,它已经过测试,可与ZooKeeper 3.4。*版一起...

    详解如何在阿里云上安装mysql

    我之前用过mssql,oracle,postgresql,mysql。目前阿里云上面暂时没有oracle。就我个人使用情况来看,创建项目我会首选mysql。 卸载已有的mysql 系统中可能早已存在mysql数据库,所以在安装之前我们需要将其卸载掉...

    Linux操作系统基础教程

    者的使用活动基本不受限制(只要你不将它用于商业目的),而不必像使用微软产品是那样, 2需要为购满许可证付出高价还要受到系统安装数量的限制。我在讲义的最后面附有 GPL 的 非官方中文译稿。目前 Linux 中国的...

    delphi / c++ builder 10.1 Berlin 安装Intraweb 14.1.5

    1. 打开IDE,Component / Install Packages...,选择旧版本Intrawebxxxx.bpl,Remove. 2.用IWBundledRemovalTool工具将旧版本文件删除(如果没有此工具可从网上下载或先随便安装一个版本,把此工具复制出来)。 3....

    Java NIO原理和使用

    这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,...

    一个只有几百K大小的绿色刻录软件

    Remove 将选中的文件/文件夹从排版中移除 Reparent 和Nero或NTI等软件不同,如果你要在排版中改变某个文件/文件夹所在的文件夹名称或者放到一个子文件夹中,不是事先建好文件夹而是用这个按钮来进行修改,点击后将会...

    C++ MFC实现飞机大战游戏

     AfxMessageBox()是模态对话框,你不进行确认时程序是否往下运行时,它会阻塞你当前的线程,除非你程序是多线程的程序,否则只有等待模态对话框被确认。  在MFC中,afxmessagebox是全局的对话框最安全,也最方便。...

    计算机应用技术(实用手册)

    如果没有安装IDE设备,我们可以选择NONE参数,这样可以加快系统的启动速度,在一些特殊操作中,我们也可以通过这样来屏蔽系统对某些硬盘的自动检查。 图中2部分是DRIVE A和DRIVE B软驱设置,如果没有A或B驱动器,...

    vmtools-linux.iso

    2.安装redhat,这个安装过程就省略,没安过的可以也去G一下; 3.安装vm tools: 1)以ROOT身份进入LINUX 2)按下 CTRL ALT组合键,进入主操作系统,点击VMWARE状态栏安装提示,或者点击 虚拟菜单下的安装虚拟机工具子菜单. ...

    dreamweaver的各种组件

    Administration Commands 一些简单的命令让你能打开InsertMenu.htm, CommandMenu.htm and Default.html 来编辑Dreamweaver,这样您可以编辑Insert、COMMAND和默认模板! Shop for Extensions 这是一个很酷的COMMANDS...

Global site tag (gtag.js) - Google Analytics