Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с XML 
:(
    Опции темы
hotspring
Дата 14.3.2007, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.3.2007

Репутация: нет
Всего: нет



Здравствуйте.
Есть xml файл, который является результатом эксперимента. Суть задачи состоит в том, что нужно разобрать его, удалить некоторое количество блоков и сохранить. Файл имеет размеры от пяти до десяти мегабайт. Использовать нужно встроенный в sdk парсер.
Так как я в первый раз столкнулась с xml, то соответсвенно у меня куча проблем и вопросов.

Поместить в list все ID в принципе не трудно, но как поместить все в data, т.е. ключ это ID, а значение это массив param? 
Помещать все в память я решила потому, что если хранить в файле, то удаление будет очень и очень медленным. Хотя может я и ошибаюсь?
Как сохранить потом data в xml?

И вопросы, который как то я не поняла:
Что лутше приработе с большим документом SAX или DOM?
Зачем нужен DTD, что он дает?  


Код

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.HashMap;

public class XMLLoader
{
    private InputSource source;
    private SAXParser parser;
    private DefaultHandler documentHandler;
    private ArrayList <String> list = new ArrayList<String>();
    private HashMap<String, String[]> data;
    public XMLLoader()
    {
        try
        {
            Reader reader = new InputStreamReader(new FileInputStream("test.xml"));
            source = new InputSource(reader);
            parser = SAXParserFactory.newInstance().newSAXParser();
        }
        catch (Exception ex)
        {
        }
        documentHandler = new XMLParser();
    }
    public void parse() throws Exception
    {
        parser.parse(source, documentHandler);
    }
    class XMLParser extends DefaultHandler
    {
        public void startElement(String uri, String localName,String qName, Attributes attributes)
        {


        }
        public void endElement(String uri, String localName,String qName)
        {

        }
    }
    public ArrayList <String> getList()
    {
        return list;
    }
    public HashMap <String, String[]> getData(){
        return data;
    }
    public static void main(String arg[])
    {
        XMLLoader ld = new XMLLoader();
        try
        {
            ld.parse();
        }
        catch (Exception ex)
        {
        }
    }
}

Код

<?xml version="1.0" encoding="Windows-1251"?>
<laseranalysis>
   <analysis>
      <test ID="45234">
      <param1>    </param1>
         <param2>    </param1>
         <param3>    </param1>
         <param4>    </param1>
         <param5>    </param1>
         <param6>    </param1>
         <param7>    </param1>
         <param8>    </param1>
         <param9>    </param1>
         <param10>    </param1>
         <param11>    </param1>
         <param12>    </param1>
      </test>
   </analysis>
   <analysis>
      <test ID="458834">
      <param1>    </param1>
         <param2>    </param1>
         <param3>    </param1>
         <param4>    </param1>
         <param5>    </param1>
         <param6>    </param1>
         <param7>    </param1>
         <param8>    </param1>
         <param9>    </param1>
         <param10>    </param1>
         <param11>    </param1>
         <param12>    </param1>
      </test>
   </analysis>
<laseranalysis/>

PM MAIL   Вверх
JUncle
Дата 14.3.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 6.4.2006
Где: Казань, РФ

Репутация: нет
Всего: 1



Цитата(hotspring @  14.3.2007,  21:25 Найти цитируемый пост)
И вопросы, который как то я не поняла:
Что лутше приработе с большим документом SAX или DOM?
Зачем нужен DTD, что он дает?  

Пожалуй отвечу только на эти:
1. Вероятно SAX. DOM создает полное дерево элементов. Соответственно будет тербовать очень много памяти при таком объеме файла.
2.  Document Type Definition - язык описания структуры XML документа. Позволяет проверить корректность XML документа.
В настоящее время вытесняется стандартом XML Schema.
--------------------
class JUncle extends Man // singleton{/*...*/}
PM MAIL   Вверх
LSD
Дата 14.3.2007, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Все зависит от того, какой именно анализ требуется для данных. Если для него требуется держать все данные в памяти, то можно и DOM использовать, если удобно.
А если для анализа не требуется, чтобы все данные присутсвовали в памяти, то можно в памяти вообще ничего не держать, а генерировать выходной XML прямо в DefaultHandler-е (Генерация XML с помощью SAXTransformerFactory).


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
hotspring
Дата 14.3.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.3.2007

Репутация: нет
Всего: нет



А каков механизм работы парсера с использованием DTD? Ошибки в структуре и в ходе парсинга видны.
Осталось:
Поместить в list все IDи поместить все в data, т.е. ключ это ID, а значение это массив param? 
PM MAIL   Вверх
LSD
Дата 15.3.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(hotspring @  14.3.2007,  23:53 Найти цитируемый пост)
А каков механизм работы парсера с использованием DTD? Ошибки в структуре и в ходе парсинга видны.

Они видны тебе, и то если ты встроишь специальную проверку (например, проверить что внутри тега analysis обязательно первым идет тег test). А тут за тебя это делает парсер.

Цитата(hotspring @  14.3.2007,  23:53 Найти цитируемый пост)
Поместить в list все IDи поместить все в data, т.е. ключ это ID, а значение это массив param?

Можно и так, все зависит от того, что тебе нужно.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
hotspring
Дата 15.3.2007, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.3.2007

Репутация: нет
Всего: нет



А как поместить все в data?
У меня что-то не выходит
PM MAIL   Вверх
LSD
Дата 15.3.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Код
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.*;
import java.util.*;

public class XMLLoader
{
  private InputSource source;
  private SAXParser parser;
  private DefaultHandler documentHandler;
  private ArrayList<String> list = new ArrayList<String>();
  private HashMap<Integer, List<String>> data;

  public XMLLoader()
  {
    try
    {
      data = new HashMap<Integer, List<String>>();
      Reader reader = new InputStreamReader(new FileInputStream("test.xml"));
      source = new InputSource(reader);
      parser = SAXParserFactory.newInstance().newSAXParser();
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
    documentHandler = new XMLParser();
  }

  public void parse() throws Exception
  {
    parser.parse(source, documentHandler);
  }

  public ArrayList<String> getList()
  {
    return list;
  }

  public HashMap<Integer, List<String>> getData()
  {
    return data;
  }

  public static void main(String arg[])
  {
    try
    {
      XMLLoader ld = new XMLLoader();
      ld.parse();
      HashMap<Integer, List<String>> data = ld.getData();

      for(Integer key : data.keySet())
        System.out.println(key + " => " + data.get(key));
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
  }

  class XMLParser extends DefaultHandler
  {
    private Integer id;
    private ArrayList<String> params;
    private boolean addParam;
    private StringBuffer buffer = new StringBuffer();

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)
    {
      if(qName.equals("test"))
      {
        id = new Integer(attributes.getValue("ID"));
        params = new ArrayList<String>();
      }
      else if(qName.startsWith("param"))
      {
        addParam = true;
      }
    }

    @Override
    public void characters(char ch[], int start, int length)
    {
      if(addParam)
        buffer.append(ch, start, length);
    }

    @Override
    public void endElement(String uri, String localName, String qName)
    {
      if(qName.equals("test"))
      {
        data.put(id, params);
        id = null;
        params = null;
      }
      else if(qName.startsWith("param"))
      {
        params.add(buffer.toString());
        buffer.setLength(0);
        addParam = false;
      }
    }
  }
}

Код
<?xml version="1.0" encoding="Windows-1251"?>
<laseranalysis>
  <analysis>
    <test ID="45234">
      <param1>a======a</param1>
      <param2>b======b</param2>
      <param3>c======c</param3>
      <param4>d======d</param4>
    </test>
  </analysis>
  <analysis>
    <test ID="458834">
      <param1>a------a</param1>
      <param2>b------b</param2>
      <param3>c------c</param3>
      <param4>d------d</param4>
    </test>
  </analysis>
</laseranalysis>



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0740 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.