本站首页    管理页面    写新日志    退出


«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9712282
建立时间:2004年12月20日




[java语言]DOM3的使用续 
原创空间,  软件技术,  电脑与网络

邢红瑞 发表于 2007/1/7 15:43:18

DOM3可以使用多种实现,来构造DOM实现的实例,可使用DomImplementationRegistry类的newInstance方法,创建一个DOM实现注册表。注册表中可包含各种具体的DOM实现,默认情况下,使用JAXP内置的DOM实现。一.DOMImplementationRegistry JAXP1.3内置了对W3C DOM第3级的支持,从DOMImplementationRegistry实例调用getDOMImplementation方法,可创建Java内置DOM实现的实例。例如: DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance(); DOMImplementation impl = registry.getDOMImplementation("XML 3.0");newInstance newInstance()说明获得 DOMImplementationRegistry 的新实例。 DOMImplementationRegistry 是由应用程序还是实现进行初始化,这取决于上下文,首先检查 Java 系统属性 org.w3c.dom.DOMImplementationSourceList 的值和服务提供者(其内容位于 "META_INF/services/org.w3c.dom.DOMImplementationSourceList" )。此属性的值是一个由空格分隔的实现 DOMImplementationSource 接口的可供使用的类名称列表。列表在类名称列表中的每个类都实例化,并将遇到的所有异常抛给应用程序。 返回:已初始化的 DOMImplementationRegistry 实例 抛出: ClassNotFoundException - 如果无法找到任何指定的类 InstantiationException - 如果任何指定的类是接口或抽象类 IllegalAccessException - 如果指定类的默认构造方法不可访问 ClassCastException - 如果任何指定的类没有实现 DOMImplementationSource getDOMImplementation说明返回第一个具有所需功能的实现;如果找不到具有所需功能的任何实现,则返回 null。 参数:features - 指定所需功能的字符串。这是一个空格分隔的列表,列表中每个功能都由其名称指定,可以选择后面跟随一个空格和版本号。此列表的形式类似如下:"XML 1.0 Traversal +Events 2.0" 返回:具有所需功能的实现;如果找不到具有所需功能的任何实现,则返回 null。当然也可以强制指定,使用xerces的实现try {        System.setProperty(DOMImplementationRegistry.PROPERTY,             "org.apache.xerces.dom.DOMImplementationSourceImpl");        DOMImplementationRegistry registry =              DOMImplementationRegistry.newInstance();        DOMImplementationLS impl =             (DOMImplementationLS)registry.getDOMImplementation("LS");         DOMImplementation oldimpl = (DOMImplementation)impl;        Document testdoc = oldimpl.createDocument("", "hongrui", null);       } catch (Exception e){        System.out.println(e.toString());      }   }创建了一个没有命名空间的,root element为hongrui的Document.二 使用LS(Load and Save)加载文档 用于加载和保存文档的DOMImplementationLS实现,通过getFeature方法获得。DOMImplementationLS ls = (DOMImplementationLS)impl.getFeature ("LS", "3.0");创建解析器实例,并为解析器指定输入源,要加载文档,需要创建一个解析器,解析器接受LSInput对象作为输入源,LSInput接口包含了解析器加载文档的来源,二进制文件流、字符流、可以访问的URI位置等都可以作为解析器的输入源。从文件中加在LSParser parser = ls.createLSParser((short)1, null); LSInput input = ls.createLSInput(); input.setByteStream(new FileInputStream("web.xml")); Document dom = parser.parse(input); LSInput的输入源可以通过setByteStream(设置输入源为二进制文件流)、setCharacterStream(设置输入源为字符流)、setSystemId(设置文件路径,可配合setBaseURI设置URI的基准地址)和setStringData(传入XML文档的字符串形式)这4种方法指定。setByteStream、setCharacterStream和setStringData这3种形式不应重复使用,先后设置这3个来源,只有一个来源有效。如果设置了这3种形式之一,则setSystemId设置的文件路径将作为解析文档时的参考地址。 LSParser的parse方法将接受传入的LSInput对象加载对应的XML文档,如成功解析文档,则返回一个DOM文档对象。而获得了Document(文档)对象实例后,就可以按DOM接口的方法处理文档中的节点。在修改了文档之后,可以使用LSOutput和LSSerializer接口的实例对象,将文档输出到LSOutput指定的输出对象中。本示例将修改后的代码输出到控制台,代码如下: LSOutput output = ls.createLSOutput(); output.setByteStream(System.out); LSSerializer serializer = ls.createLSSerializer(); serializer.write(dom, output); LSOutput的输出源可以通过setByteStream(指定输出目标为二进制流)、setCharacterStream(指定输出目标为字符流)和setSystemId(指定输出目标路径)这3种方法指定。LSSerializer的write方法将指定的DOM节点输出到LSOutput指定的输出目标。 三.移动Node从一个Document到另一个在DOM2中,移动节点,必须先倒入,从另一文档向此文档导入节点,而不改变或移除原始文档中的源节点;此方法创建源节点的一个新副本。返回的节点没有父节点;(parentNode 为 null)。dom3中使用adoptNode,把另一文档中的节点采用到此文档。如果受支持,则它将更改源节点的 ownerDocument、它的子节点以及连接的属性节点(如果有)。如果源节点有父节点,则首先从其父节点的子节点列表中移除它。此方法允许将子树从一个文档移动到另一个文档(与 importNode() 不同,后者创建源节点副本,而不是移动子树)。失败时,应用程序应该改为使用 Document.importNode()。注意,如果采用的节点已经是此文档的一部分(即源文档和目标文档相同),此方法仍可有效地从其父节点(如果有)的子列表移除源节点。try {        System.setProperty(DOMImplementationRegistry.PROPERTY,             "org.apache.xerces.dom.DOMImplementationSourceImpl");        DOMImplementationRegistry registry =              DOMImplementationRegistry.newInstance();        DOMImplementationLS impl =             (DOMImplementationLS)registry.getDOMImplementation("LS");         DOMImplementation oldimp = (DOMImplementation)impl;        Document testDoc = oldimp.createDocument("", "baseelement", null);        Node testroot = testDoc.getDocumentElement();        testroot.appendChild(testDoc.createElement("theChild"));         LSParser builder = impl.createLSParser(                         DOMImplementationLS.MODE_SYNCHRONOUS, null);         Document document = builder.parseURI("order.xml");         document.adoptNode(testroot);        root.appendChild(testroot);       } catch (Exception e){        System.out.println(e.toString());      }我一般还是使用importNode.判断节点是否相同,Node.compareDocumentPosition(other) ,Node.isSameNode(other) 和 Node.isEqualNode(other). 四.文本处理的增强,getTextContent()可以得到child element的文本.例如try {        System.setProperty(DOMImplementationRegistry.PROPERTY,             "org.apache.xerces.dom.DOMImplementationSourceImpl");        DOMImplementationRegistry registry =              DOMImplementationRegistry.newInstance();        DOMImplementationLS impl =             (DOMImplementationLS)registry.getDOMImplementation("LS");         LSParser builder = impl.createLSParser(                         DOMImplementationLS.MODE_SYNCHRONOUS, null);         Document document = builder.parseURI("candy.xml");        Element allofit = (Element)document.getDocumentElement();        System.out.println(allofit.getTextContent());       } catch (Exception e){        System.out.println(e.toString());      }replaceWholeText将当前节点和所有逻辑上相邻的文本节点的文本替换为指定的文本。移除包括当前节点在内的所有逻辑上相邻的文本节点,除非它是替换文本的接收方。isElementContentWhitespace返回此文本节点是否包含 元素内容空白符,即经常所称的“可忽略的空白符”。在加载文档期间确定文本节点在元素内容中是否包含空白符,或者在使用 Document.normalizeDocument() 时是否进行验证。


阅读全文(6579) | 回复(1) | 编辑 | 精华
 


回复:DOM3的使用续
原创空间,  软件技术,  电脑与网络

风南(游客)发表评论于2008/1/8 8:57:06

这次写的不错。 :)


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144793585 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号