2009-07-16 3 views
2

Я разбираю XML-документ в своей собственной структуре, но создание его очень медленное для больших входов - есть ли лучший способ сделать это?медленное построение древовидной структуры из XML

public static DomTree<String> createTreeInstance(String path) 
    throws ParserConfigurationException, SAXException, IOException { 
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = docBuilderFactory.newDocumentBuilder(); 
    File f = new File(path); 
    Document doc = db.parse(f);  
    Node node = doc.getDocumentElement(); 
    DomTree<String> tree = new DomTree<String>(node); 
    return tree; 
} 

Вот мой DomTree конструктор:

/** 
    * Recursively builds a tree structure from a DOM object. 
    * @param root 
    */ 
    public DomTree(Node root){  
     node = root;   
     NodeList children = root.getChildNodes(); 
     DomTree<String> child = null; 
     for(int i = 0; i < children.getLength(); i++){ 
      child = new DomTree<String>(children.item(i)); 
      if (children.item(i).getNodeType() != Node.TEXT_NODE){ 
       super.children.add(child); 
      } 
     } 
    } 

UPDATE:

Я протестированный метод createTreeInstance() с помощью XML-файл 100MB:

  • Создания docBuilderFactory .. . Done [3ms]
  • Создание docBuilder ... Совершено [21ms]
  • разбора файл ... Готово [5646ms]
  • getDocumentElement ... Готов [1мс]
  • создание DomTree ... Готово [17076ms]

UPDATE:

Как предлагает Джон Доу ниже, может быть более целесообразным использовать SAX - я никогда раньше не использовал SAX, так что есть хороший способ конвертировать то, что я должен использовать SAX?

ответ

2

Если вы разбираете большой XML-документ, вы не используете DOM, вы используете SAX, парсинг вытягивания, такой как XPP3 или что-то еще.

Проблема в том, что у вас не будет «дерева XML» в памяти, которое может быть удобным, вы получаете только события и обрабатываете их соответственно. Однако это будет память мудро, и вы можете сопоставить элементы с вашими структурами данных.

+0

У вас есть пример? – Robert

0

Вы пробовали профилировать это? Я думаю, что это может быть более поучительно, чем смотреть на код. Нередко возникает узкое место, которого вы обычно не ожидаете. Простой профиль (который вы можете сделать тривиально в коде) - это время разбора DOM против вашего дерева.

Для более углубленного профилирования в качестве оценочной копии можно найти JProfiler. Другие могут рекомендовать что-то более подходящее.

+0

Я только протестированные большую программу, которая использует его, и это показывает, что этот процесс является узким местом – Robert

+0

Так что я бы, конечно, посмотреть на DOM разборе против вашего здания дерева –

+0

Создание docBuilderFactory ... \t Done [ 3ms] Создание DocBuilder ... \t Done [21ms] разбор файла ... \t Done [5646ms] getDocumentElement ... \t Done [1мс] создание DomTree ... \t Готово [17076ms] – Robert