<?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++) { 
}

解决方案 »

  1.   

    Element root=doc.getRootElement()//得到根元素
    java.util.List students=root.getChildren()//得到根元素所有的子元素的集合
    java.util.List a=student.getChildren()//得到a元素所有的子元素的集合
      

  2.   

    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());//有空格,是文件内容缩进,可以判断剔除.
    }
      

  3.   

    Element继承自Node接口,里面有很多方法可以用
    import org.w3c.dom.*
    ...
    Document doc = ...
    Element root = doc.getDocumentElement(); 
    Node child = root.getFirstChild();
    while(child.getNextSibling()!=null)
    {
       ......
       child = child.getNextSibling()
    }
      

  4.   

    关键用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++) {
    Element accountElement = (Element) accountNodes.item(accountNodeIndex);
    String accountID = accountElement.getTextContent();
    out.print(accountID);
    }
    } catch (Exception ex) {
    out.print(ex.getLocalizedMessage());
    }
    %>
    </body>
    </html>
      

  5.   

    嗯,shan1119(大天使,卐~解!) 正解,但是贴主为什么不用xpath呢?解析起来要方便的多,并且代码会更加清晰。Document doc = ...
    List firstLevelObjectNodeList = doc.selectNodeList("/test/object");
      

  6.   

    String path=..............//xml路径
    SAXReader reader = new SAXReader();
    Document document = reader.read(path);
    Element root = doc.getRootElement();//取得根节点
    //取得一及节点
    for (Iterator i = root.elementIterator(); i.hasNext();) {

    Element elementFir = (Element) i.next();//取得二及节点
    // 遍历一级节点内的信息
    for (Iterator j = elementFir.attributeIterator(); j.hasNext();) {       ..............
              }
    //取得一及节点
              for (Iterator j = elementFir.elementIterator(); j.hasNext();) {
    ...........
               }
      

  7.   

    String path=..............//xml路径
    SAXReader reader = new SAXReader();
    Document document = reader.read(path);
    Element root = doc.getRootElement();//取得根节点
    for (Iterator i = root.elementIterator(); i.hasNext();) {

    Element elementFir = (Element) i.next();//取得一及节点
    // 遍历一级节点内的信息
    for (Iterator j = elementFir.attributeIterator(); j.hasNext();) {       ..............
              }
              for (Iterator j = elementFir.elementIterator(); j.hasNext();) {
           Element elementSce = (Element) i.next//取得二及节点           }