« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
| 公告 |
戒除浮躁,读好书,交益友 |
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() 时是否进行验证。 |
|
» 1 »
|