日期:2014-05-20  浏览次数:20655 次

用getElementsByTagName取xml子节点问题
<?xml   version= "1.0 "   encoding= "UTF-8 "?>
<test>
      <object   name= "n1 "   level= "1 ">
            <object   name= "2 "   level= "2 "> </object>
      </object>
      <object   name= "n3 "   level= "1 ">
            <object   name= "4 "   level= "2 "> </object>
      </object>

</test>
============
以上是XML文件内容(文件格式是utf-8),注意object节点分成二个层次,object中包含了另一个object.

我现在想把object逐层取出来,但发现用getElementsByTagNam( "object ")会一次性把所有的 <object> 节点取出.   说以下代码,总是返回所有的object节点,   我实际上想先取出第一层object,然后再取根据第一层往下找.
import   org.w3c.dom.*
...
Document   doc   =   ...
Element   root   =   doc.getDocumentElement();  
NodeList   students   =   root.getElementsByTagName( "object ");  
for   (int   i   =   0;   i   <   students.getLength();   i++)   {  
}




------解决方案--------------------
Element root=doc.getRootElement()//得到根元素
java.util.List students=root.getChildren()//得到根元素所有的子元素的集合
java.util.List a=student.getChildren()//得到a元素所有的子元素的集合
------解决方案--------------------
import org.w3c.dom.*
...
Document doc = ...
Element root = doc.getDocumentElement();
NodeList students = root.getChildNodes();
for (int i = 0; i < students.getLength(); i++) {
System.out.println(students.item(i).getAttributes());//有空格,是文件内容缩进,可以判断剔除.
}
------解决方案--------------------
Element继承自Node接口,里面有很多方法可以用
import org.w3c.dom.*
...
Document doc = ...
Element root = doc.getDocumentElement();
Node child = root.getFirstChild();
while(child.getNextSibling()!=null)
{
......
child = child.getNextSibling()
}

------解决方案--------------------
关键用XPathAPI.selectNodeList(doc, "节点/子节点/... ")

注意:org.apache.xpath.XPathAPI 类已经移植到了 JRE 1.5 中,重构为com.sun.org.apache.xpath.internal.XPathAPI
以下为jsp代码例子

<%@ page language= "java " contentType= "text/html; charset=UTF-8 "pageEncoding= "UTF-8 "%>
<%@ page import= "javax.xml.parsers.* "%>
<%@ page import= "javax.xml.parsers.DocumentBuilderFactory "%>
<%@ page import= "org.apache.xpath.* "%>
<%@ page import= "java.io.File "%>
<%@ page import= "org.w3c.dom.* "%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN " "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns= "http://www.w3.org/1999/xhtml ">
<head>
</head>
<body>
<%
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File( "D:\\Java\\Work\\space\\WebContent\\test\\x.xml "));
NodeList accountNodes = XPathAPI.selectNodeList(doc, "/a/aaa ");
for (int accountNodeIndex = 0; accountNodeIndex < accountNodes.getLength(); accountNodeIndex++) {