服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java中文档对象模型dom经验小结

ad_qqread_mid_big">   在实际使用过程中,有几种状况使用很频繁,但是dom的接口的设计却使该操作很麻烦,所以分别添加了相应的处理方法。

  其中最麻烦的要数获取一个节点的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));
}

  基本上就这些常用的了,其它还有一些零碎的方法,不过都不常用到,就不作介绍了。
>>>更多专题请看java对象专题
上一页 1 2 3 
相关内容:硬盘  数据库  设计  包装  xml  
【收藏此页】【大 中 小】【打印】【关闭】
上一篇:基于java的动画编程基础第一部分
下一篇:java编程图像处理技巧


10万个软件免费高速下载
教育教学 安全相关 游戏娱乐 源码下载 编程开发 数码软件 其它类别
网络软件 联络聊天 系统工具 媒体工具 图形图像 应用软件 行业软件
·java: jni完全手册
·java reflection (java反射)详解
·java连接数据库谈
·深入java字节码加密
·java虚拟机类装载:原理、实现与应用
·java反编译的研究
·jsp与java mail api
·让界面更加绚丽 java se 6.0 gui体验
·为什么是java ee 5
·使用java 输出/输出流读写数据
 
·接口和抽象类的定义方式举例说明
·用maven制作java项目发行包
·java 基础入门 pom.xml 元素描述
·用jbuilder2007开发扩展jsf标签的插
·抽象类对象类和对象包装类
·使用java实现在文件中添加字符串
·instanceof和回调概念
·java变量的赋值与传递
·java se6调用java编译器的两种新方法
·weblogic运用db的java控件访问数据库

扫描关注微信公众号