2010-08-30 3 views
1

В приведенном ниже примере кода у меня есть вопрос о списке. Мой prof добавляет объект Document в ArrayList. Похоже, это просто добавит в список один объект Document, а не каждый отдельный узел. Но затем, глядя на цикл while, кажется, что он получает элемент в индексе 0, анализирует информацию, затем удаляет этот элемент, чтобы он мог посмотреть следующую информацию. Таким образом, похоже, что в ArrayList больше происходит только один объект Document. Является ли то, что происходит в части ArrayList/while? Я запутался в том, как работает этот код. Заранее спасибо!Разбор XML-файла в Java

import java.io.*; 
import java.util.*; 
import javax.xml.parsers.*; 
import org.w3c.dom.*; 
import org.xml.sax.*; 


public class RSSReader { 
    public static void main(String[] args) { 
     File f = new File("testrss.xml"); 
     if (f.isFile()) { 
      System.out.println("is File"); 
      RSSReader xml = new RSSReader(f); 
     } 
    } 

    public RSSReader(File xmlFile) { 
     try { 
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      Document doc = builder.parse(xmlFile); 

      List<Node> nodeList = new ArrayList<Node>(); 
      nodeList.add(doc); 

      while(nodeList.size() > 0) 
      { 
      Node node = nodeList.get(0); 

      if (node instanceof Element) { 
       System.out.println("Element Node: " + ((Element)node).getTagName()); 
       NamedNodeMap attrMap = node.getAttributes(); 
       for(int i = 0; i < attrMap.getLength(); i++) 
       { 
        Attr attribute = (Attr) attrMap.item(i); 
        System.out.print("\tAttribute Key: " + attribute.getName() 
         + " Value: " + attribute.getValue()); 
       } 
       if(node.hasAttributes()) 
        System.out.println(); 
      } 
      else if(node instanceof Text) 
       System.out.println("Text Node: " + node.getNodeValue()); 
      else 
       System.out.println("Other Type: " + node.getNodeValue()); 

      if(node.hasChildNodes()) 
      { 
       NodeList nl = node.getChildNodes(); 
       for(int i = 0; i < nl.getLength(); i++) 
       { 
        nodeList.add(nl.item(i)); 
       } 
      } 
      nodeList.remove(0); 
      } 
     } 

     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     catch (SAXException e) { 
      e.printStackTrace(); 
     } 
     catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } 
     catch (ParserConfigurationException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

ответ

2

То, что я думаю, что ваш профессор демонстрирует здесь, называется алгоритмом Breadth First. Ключевой блок кода в петле

if(node.hasChildNodes()) 
{ 
    NodeList nl = node.getChildNodes(); 
    for(int i = 0; i < nl.getLength(); i++) 
    { 
     nodeList.add(nl.item(i)); 
    } 
} 

После обработки элемента в списке, этот код будет Chack, если элемент имеет дочерние элементы, которые должны обрабатываться. Если это произойдет, они будут добавлены в список для обработки.

Мое использование этого алгоритма, корневой элемент, если он сначала обработан, затем его дети, потом их дети, а затем дети ниже этого и т. Д., Пока в дереве не останется только листьев.

(На стороне примечания: это, по-видимому, неправильный подход для XML-документа в целом и для RSS-канала. Я думаю, вы хотели бы сделать алгоритм глубины первого, чтобы сделать вывод более понятным. case, вы можете использовать Stack вместо List.)

1

Каждый ребенок каждого узла добавляется к List<Node> этим кодом:

if(node.hasChildNodes()) 
{ 
    NodeList nl = node.getChildNodes(); 
    for(int i = 0; i < nl.getLength(); i++) 
    { 
     nodeList.add(nl.item(i)); 
    } 
} 

В основном это означает, что каждый узел в документе будет посетить.