帮我解决个难题吧。有关org.w3c.dom.Node

博主使用JDK1.5,代码中循环读取node值的方法在Eclipse作为application可执行。但在Servlet中调用该方法时,Tomcat无反应且无错误,Resin则出现java.lang.UnsupportedOperationException错误,博主寻求解决办法。

困扰我半天了。

jdk为1.5

就这段代码:

getElementStringValue(){

....

return node.getTextContent(); // node is a Node and not is null

....

}

我是循环读取得每个node的值的,作为application,在celipse中可以执行。

若在一个servlet中调用这个方法,则:

1。tomcat(5.5.9)毫无反应,甚至这个方法的调用者的调用者都不继续走了。在try   catch 中无错误。

2。在resin(2.1.16)中,出现如下错误

java.lang.UnsupportedOperationException
        at com.caucho.xml.QAbstractNode.getTextContent(QAbstractNode.java:301)
        at com.xx.xx.xml.XMLUtil.getElementStringValue(XMLUtil.java:88)

神啊,帮我。

<think>我们正在讨论的是org.w3c.dom.Node接口,它是DOM的核心接口,表示文档树中的一个节点。在DOM树中,所有节点类型都继承自Node接口,包括Element、Attr、Text等。根据用户提供的引用,特别是引用[2]和引用[3],我们可以结合这些内容来详细解释Node接口。目标:详细解释org.w3c.dom.Node接口,包括其作用、常用方法、节点类型以及如何使用。结构:1.Node接口概述2.节点类型常量(NodeTypes)3.常用方法详解4.遍历节点树5.节点操作(创建、添加、删除等)6.示例代码(使用引用[3]中的XML)7.常见问题与注意事项8.相关问题注意:用户要求参考站内引用,特别是引用[2]中提到了节点的名字、值、种类(即节点类型),引用[3]提供了一个XML示例,我们可以用这个示例来演示。</think>### org.w3c.dom.Node 详解 `org.w3c.dom.Node` 是 W3C DOM API 的核心接口,表示 XML/HTML 文档树中的任意节点。作为 DOM 树的基类接口,所有具体节点类型(元素、属性、文本等)都继承自它。以下是详细解析: --- #### 一、节点类型与继承体系 1. **节点类型常量** | 常量 | 值 | 节点类型 | |------|----|----------| | `ELEMENT_NODE` | 1 | 元素节点(如 `<bean>`) | | `ATTRIBUTE_NODE` | 2 | 属性节点(如 `name="/unitPrice.do"`) | | `TEXT_NODE` | 3 | 文本节点(如 `"form"`) | | `CDATA_SECTION_NODE` | 4 | CDATA区块 | | `COMMENT_NODE` | 8 | 注释节点 | | `DOCUMENT_NODE` | 9 | 文档根节点 | 2. **继承关系** ```mermaid graph BT Node --> Element Node --> Attr Node --> Text Node --> Document Node --> Comment ``` --- #### 二、核心方法详解 | 方法 | 作用 | 返回值类型 | |------|------|------------| | `getNodeType()` | 获取节点类型 | `short` | | `getNodeName()` | 获取节点名称 | `String` | | `getNodeValue()` | 获取节点值 | `String` | | `getParentNode()` | 获取父节点 | `Node` | | `getChildNodes()` | 获取所有子节点 | `NodeList` | | `getFirstChild()` | 获取第一个子节点 | `Node` | | `getLastChild()` | 获取最后一个子节点 | `Node` | | `getPreviousSibling()` | 获取前一个同级节点 | `Node` | | `getNextSibling()` | 获取下一个同级节点 | `Node` | | `appendChild(Node)` | 添加子节点 | `Node` | | `removeChild(Node)` | 删除子节点 | `Node` | | `cloneNode(boolean)` | 克隆节点(true=深拷贝) | `Node` | --- #### 三、节点操作实战(基于引用[3]的XML) **1. 节点遍历** ```java Document doc = ... // 解析XML NodeList beans = doc.getElementsByTagName("bean"); for (int i = 0; i < beans.getLength(); i++) { Node beanNode = beans.item(i); // 获取节点类型和名称 System.out.println("节点类型: " + beanNode.getNodeType()); // 1 (ELEMENT_NODE) System.out.println("节点名称: " + beanNode.getNodeName()); // "bean" // 遍历子节点 NodeList children = beanNode.getChildNodes(); for (int j = 0; j < children.getLength(); j++) { Node child = children.item(j); if (child.getNodeType() == Node.ELEMENT_NODE) { System.out.println("子元素: " + child.getNodeName()); // "property" } else if (child.getNodeType() == Node.TEXT_NODE) { System.out.println("文本内容: " + child.getNodeValue().trim()); } } } ``` **2. 节点操作** ```java // 创建新节点 Element newProperty = doc.createElement("property"); newProperty.setAttribute("name", "newField"); // 添加节点 Node firstBean = beans.item(0); firstBean.appendChild(newProperty); // 删除节点 Node description = firstBean.getFirstChild(); while (description != null && !description.getNodeName().equals("description")) { description = description.getNextSibling(); } if (description != null) { firstBean.removeChild(description); } // 克隆节点(深拷贝) Node clonedBean = firstBean.cloneNode(true); doc.getDocumentElement().appendChild(clonedBean); ``` --- #### 四、节点值处理技巧 1. **文本节点值** ```java // 获取<value>元素的文本内容 Node valueNode = ... // 定位到<value>元素 String textContent = valueNode.getFirstChild().getNodeValue(); // "form" ``` 2. **空白字符处理** ```java // 忽略空白文本节点 for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); if (child.getNodeType() == Node.TEXT_NODE) { String text = child.getNodeValue().trim(); if (!text.isEmpty()) { // 处理有效文本 } } } ``` 3. **CDATA区块处理** ```java if (node.getNodeType() == Node.CDATA_SECTION_NODE) { String cdata = node.getNodeValue(); // 获取原始CDATA内容 } ``` --- #### 五、最佳实践与注意事项 1. **节点类型检查** 操作前必须验证节点类型: ```java if (node.getNodeType() == Node.ELEMENT_NODE) { Element el = (Element) node; // 安全操作 } ``` 2. **节点遍历优化** - 使用`getElementsByTagName()`替代手动遍历 - 对静态文档缓存`NodeList`结果 - 避免深度递归遍历大型文档 3. **内存管理** - 及时释放不再使用的`Node`引用 - 避免在循环中创建大量临时节点 - 使用`DocumentBuilder`的`reset()`方法清理解析器状态 > **注意**:DOM解析会加载整个文档到内存,处理大型XML建议使用SAX或StAX解析器[^1] --- #### 六、与Element的协作 ```java // NodeElement if (node.getNodeType() == Node.ELEMENT_NODE) { Element element = (Element) node; String attr = element.getAttribute("name"); } // Element作为Node使用 Element bean = doc.createElement("bean"); bean.setAttribute("name", "/new.do"); doc.getDocumentElement().appendChild(bean); // Node方法 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值