ad_qqread_mid_big"> 在实际使用过程中,有几种状况使用很频繁,但是dom的接口的设计却使该操作很麻烦,所以分别添加了相应的处理方法。
其中最麻烦的要数获取一个节点的text子节点文本信息了,如下的xml节点:
在拥有element节点对象时,要获取其中的文本信息"text",首先要获取element节点的子节点列表,要判断其是否存在子节点,如果存在,那么遍历其子节点找到一个textnode节点,通过getnodevalue()方法来获取该文本信息,由于这里element节点没有信息时没有子节点,所以必须判断element节点是否存在子节点才能去访问真正包含了文本信息的textnode节点,那么如果要处理的数据都是以这种形式给出的,就会增加大量的开发代码同时让开发工作枯燥无味,因此这里使用了一个默认的约定实现,就是,给出了一个公共方法,该方法取给定node下的直接子节点的text节点文本信息,如果不存在text节点则返回null,这个约定虽然使该方法的使用有所限制,也可能导致错误使用该方法,但是,按实际使用的状况来看,这样的约定和使用方式是没有问题的,因为实际用到的都是上面举的例子的状况,代码:
上面代码将获取给定node节点的直接text子节点分开包装。
另一个很经常碰到的状况是,我希望直接定位到目标节点,获取该节点对象,而不需要通过一层一层的节点遍历来找到目标节点,dom2接口中至少提供了如下的方式来定位节点:
1、 对于document对象:
1) getdocumentelement()?d?d获取根节点对象,实际很少使用的,因为根节点基本也就只是根节点而已,实际的数据节点都是根节点下的直接子节点开始的。
2) getelementbyid(string elementid)?d?d这个方法本来应该是一个最佳的定位方法,但是在实际使用过程中没有被我使用,其主要原因就是,这里的"id"不同于一个节点的属性"id",这在org.w3c.dom.document的api说明中是明确指出,而我找了不少的资料也没有看到有关的使用方式,所以只好放弃了。
3) getelementsbytagname(string tagname)?d?d这个方法其实是没有办法的选择,只好用它了,不过实际倒也很合用,虽然该方法返回的是一个nodelist,但是实际使用时,将节点的tagname设计成特殊字符串,那么就可以直接获取了,而实际使用时,其实也差不多,很多时候会直接拿数据库中的字段名来作为tagname,以方便得获取该字段得值,在一个简单得约定下,使用了如下方法:
这个约定看似限制很大,其实实际使用时基本都是这样的,只要获取第一个给定tagname的element节点就可以了的。
4)getelementsbytagnamens(string namespaceuri, string localname)?d?d这个方法基本没有使用,因为还没有碰到需要使用命名空间的状况。
2、 对于element对象?d?d?d?delement对象和document对象雷同,少了getdocumentelement()方法,不过和document一样也都是主要使用getelementsbytagname()方法。
3、 其它的节点对象基本没有直接定位的访问方法
还有一种,是由于dom2的限制导致的,dom2规范中,不能将一个document doca的节点直接加入到另一个document docb对象的节点的子节点列表中,要这么做必须首先将doca的节点通过docb的importnode方法转换后在添加到目标节点的子节点列表中,所以也有一个方法来统一处理:
基本上就这些常用的了,其它还有一些零碎的方法,不过都不常用到,就不作介绍了。
>>>更多专题请看java对象专题
其中最麻烦的要数获取一个节点的text子节点文本信息了,如下的xml节点:
| <element> text </element> |
在拥有element节点对象时,要获取其中的文本信息"text",首先要获取element节点的子节点列表,要判断其是否存在子节点,如果存在,那么遍历其子节点找到一个textnode节点,通过getnodevalue()方法来获取该文本信息,由于这里element节点没有信息时没有子节点,所以必须判断element节点是否存在子节点才能去访问真正包含了文本信息的textnode节点,那么如果要处理的数据都是以这种形式给出的,就会增加大量的开发代码同时让开发工作枯燥无味,因此这里使用了一个默认的约定实现,就是,给出了一个公共方法,该方法取给定node下的直接子节点的text节点文本信息,如果不存在text节点则返回null,这个约定虽然使该方法的使用有所限制,也可能导致错误使用该方法,但是,按实际使用的状况来看,这样的约定和使用方式是没有问题的,因为实际用到的都是上面举的例子的状况,代码:
| /** * 这个方法获取给定node下的text节点文本信息,如果不存在text节点则返回null。 * 注意:是直接子节点,相差2层或2层以上不会被考虑。 * @param node a node 一个node。 * @return a string 如果给定节点存在text子节点,则返回第一个访问到的text子节点文本信息,如果不存在则返回null。 */ public static string getnodevalue(node node) { if (node == null) { return null; } text text = gettextnode(node); if (text != null) { return text.getnodevalue(); } return null; } /** * 这个方法获取给定node下的text节点,如果不存在text节点则返回null。 * 注意:是直接子节点,相差2层或2层以上不会被考虑。 * @param node a node 一个node。 * @return a text 如果给定节点存在text子节点,则返回第一个访问到的text子节点,如果不存在则返回null。 */ public static text gettextnode(node node) { if (node == null) { return null; } if (node.haschildnodes()) { nodelist list = node.getchildnodes(); for (int i = 0; i < list.getlength(); i++) { if (list.item(i).getnodetype() == node.text_node) { return (text) list.item(i); } } } return null; } |
上面代码将获取给定node节点的直接text子节点分开包装。
另一个很经常碰到的状况是,我希望直接定位到目标节点,获取该节点对象,而不需要通过一层一层的节点遍历来找到目标节点,dom2接口中至少提供了如下的方式来定位节点:
1、 对于document对象:
1) getdocumentelement()?d?d获取根节点对象,实际很少使用的,因为根节点基本也就只是根节点而已,实际的数据节点都是根节点下的直接子节点开始的。
2) getelementbyid(string elementid)?d?d这个方法本来应该是一个最佳的定位方法,但是在实际使用过程中没有被我使用,其主要原因就是,这里的"id"不同于一个节点的属性"id",这在org.w3c.dom.document的api说明中是明确指出,而我找了不少的资料也没有看到有关的使用方式,所以只好放弃了。
3) getelementsbytagname(string tagname)?d?d这个方法其实是没有办法的选择,只好用它了,不过实际倒也很合用,虽然该方法返回的是一个nodelist,但是实际使用时,将节点的tagname设计成特殊字符串,那么就可以直接获取了,而实际使用时,其实也差不多,很多时候会直接拿数据库中的字段名来作为tagname,以方便得获取该字段得值,在一个简单得约定下,使用了如下方法:
| /** * 这个方法检索参数element下所有tagname为:tagname的节点,并返回节点列表的第一个节点。 * 如果不存在该tagname的节点,则返回null。 * @param element 待搜索节点 * @param tagname 待搜索标签名 * @return a element 获得以tagname为标签名的节点列表的第一个节点。 */ public static element getfirstelementbyname( element element,string tagname) { return (element) getfirstelement(element.getelementsbytagname(tagname)); } /** * 从给定节点列表中获取第一个节点返回,如果节点集合为null/空,则返回null。 * @param nodelist a nodelist * @return a node */ private static node getfirstelement(nodelist nodelist) { if (nodelist == null || nodelist.getlength() == 0) { return null; } return nodelist.item(0); } |
这个约定看似限制很大,其实实际使用时基本都是这样的,只要获取第一个给定tagname的element节点就可以了的。
4)getelementsbytagnamens(string namespaceuri, string localname)?d?d这个方法基本没有使用,因为还没有碰到需要使用命名空间的状况。
2、 对于element对象?d?d?d?delement对象和document对象雷同,少了getdocumentelement()方法,不过和document一样也都是主要使用getelementsbytagname()方法。
3、 其它的节点对象基本没有直接定位的访问方法
还有一种,是由于dom2的限制导致的,dom2规范中,不能将一个document doca的节点直接加入到另一个document docb对象的节点的子节点列表中,要这么做必须首先将doca的节点通过docb的importnode方法转换后在添加到目标节点的子节点列表中,所以也有一个方法来统一处理:
| /** * 这个方法将参数appendeddoc的根节点及其以下节点附加到doc的跟节点下面。 * 作为doc的跟节点的作后一个子节点。 * 相当于:doc.appenddoc(appendeddoc); * @param doc a document * @param appendeddoc a document */ public static void appendxmldocument(document doc, document appendeddoc) { if (appendeddoc != null) { doc.getfirstchild().appendchild( doc.importnode(appendeddoc.getfirstchild(), true)); } } /** * 这个方法将参数appendeddoc的根节点及其以下节点附加到node节点下面。 * 作为node节点的作后一个子节点。 * 相当于:node.appenddoc(appendednode); * @param node 待添加的节点将被添加到该节点的最后。 * @param appendednode a node 这个节点将被添加作为node节点的最后一个子节点。 */ public static void appendxmldocument(node node, node appendednode) { if (appendednode == null) { return; } if (appendednode instanceof document) { appendednode = ((document) appendednode).getdocumentelement(); } node.appendchild(node.getownerdocument().importnode(appendednode, true)); } |
基本上就这些常用的了,其它还有一些零碎的方法,不过都不常用到,就不作介绍了。
| 上一页 1 2 3 |
| 相关内容:硬盘 数据库 设计 包装 xml |
| 【收藏此页】【大 中 小】【打印】【关闭】 | |
| 上一篇:基于java的动画编程基础第一部分 下一篇:java编程图像处理技巧 10万个软件免费高速下载 | |
| ||||||||||||||
|
|
-
关于我们
公司介绍 最新动态 联系我们 -
产品与服务
域名注册 jsp空间 php空间 -
常见问题
空间操作手册 网站备案相关 退款相关问题 -
技术支持
技术 QQ :178966803 联系电话:13616026886 联系邮箱:fjjsp@vip.163.com
扫描关注微信公众号
闽公网安备 35060202000074号