快速业务通道

Java中的XML: Java文档模型的用法 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
将文档的根元素传递给我马上要谈到的递归修改方法。这些代码与本文中所有文档模型的代码在本质上是相同的,所以在剩余的示例中我将跳过它,不再做任何讨论。

第三个代码块(第 8-11 行)处理将文档作为文本写入输出流。这里, OutputFormat 类包装文档,并为格式化生成的文本提供了多种选项。 XMLSerializer 类处理输出文本的实际生成。

Xerces 的 modify 方法只使用标准 DOM 接口,所以它还与任何其它 DOM 实现兼容。清单 2 显示了代码。

清单 2. DOM Modify 方法

1 protected void modifyElement(Element element) { 2  // loop through child nodes 3  Node child; 4  Node next = (Node)element.getFirstChild(); 5  while ((child = next) != null) { 6   // set next before we change anything 7   next = child.getNextSibling(); 8   // handle child by node type 9   if (child.getNodeType() == Node.TEXT_NODE) { 10    // trim whitespace from content text 11    String trimmed = child.getNodeValue().trim(); 12    if (trimmed.length() == 0) { 13     // delete child if nothing but whitespace 14     element.removeChild(child); 15    } else { 16     // create a "text" element matching parent namespace 17     Document doc = element.getOwnerDocument(); 18     String prefix = element.getPrefix(); 19     String name = (prefix == null) ? "text" : (prefix + ":text"); 20     Element text =  21      doc.createElementNS(element.getNamespaceURI(), name); 22     // wrap the trimmed content with new element 23     text.appendChild(doc.createTextNode(trimmed)); 24     element.replaceChild(text, child); 25    } 26   } else if (child.getNodeType() == Node.ELEMENT_NODE) { 27    // handle child elements with recursive call 28    modifyElement((Element)child); 29   } 30  } 31 }

清单 2 中显示的方法所使用的基本方法与所有文档表示的方法相同。通过一个元素调用它,它就依次遍历那个元素的子元素。如果找到文本内容子元素,要么删除文本(如果它只是由空格组成的),要么通过与包含元素相同的名称空间中名为“text”的新元素来包装文本(如果有非空格的字符)。如果找到一个子元素,那么这个方法就使用这个子元素,递归地调用它本身。

对于 DOM 实现,我使用一对引用: child 和 next 来跟踪子元素排序列表中我所处的位置。在对当前子节点进行任何其它处理之前,先装入下个子节点的引用(第 7 行)。这样做使得我能够删除或替代当前的子节点,而不丢失我在列表中的踪迹。

当我创建一个新元素来包装非空白的文本内容(第 16-24 行)时,DOM 接口开始有点杂乱。用来创建元素的方法与文档关联并成为一个整体,所以我需要在所有者文档中检索当前我正在处理的元素(第 17 行)。我想将这个新元素放置在与现有的父元素相同的名称空间中,并且在 DOM 中,这意味着我需要构造元素的限定名称。根据是否有名称空间的前缀,这个操作会有所不同(第 18-19 行)。利用新元素的限定名称,以及现有元素中的名称空间 URI,我就能创建新元素(第 20-21 行)。

一旦创建了新元素,我只要创建和添加文本节点来包装内容 String ,然后用新创建的元素来替代原始文本节点(第 22-24 行)。

清单 3. Cr

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号