Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > largeXML


Автор: DEMOVERSION 26.10.2005, 10:35
Скажите пожалуйста ц помошью чего можна разобрать очень большой XML. Надо взять с него даные и выполнить некоторые вучисления.

Examle XML:
<root>
<sample a="1 " b="3">
<sample a="1 " b="3">
<sample a="2 " b="3"> // vse strocki odinakovue, menyautsya tolko znacheniya.
<sample a="1 " b="3">
<sample a="65 " b="3">
<sample a="1 " b="3">
.....
</root>

XML files < 20 Mb

Автор: pvo 26.10.2005, 11:13
С помощью SAXParser

Автор: DEMOVERSION 26.10.2005, 11:27
А как насчет Dom4J? А как лучше сохранять даные? Мне надо будет узнать например средние значение по-полю???

Автор: pvo 26.10.2005, 11:38
Цитата(DEMOVERSION @ 26.10.2005, 11:27)
А как насчет Dom4J? А как лучше сохранять даные? Мне надо будет узнать например средние значение по-полю???


Я с Dom4J не работал, но судя по названию он строит Dom дерево в памяти. При большом размере файла это будет супер не эффективно.
Насчет сохранения - тут все зависит от того, какие еще операции нужны, какое допустимо время отклика и пр.
Средние значения полей можно и при обработке XML посчитать.

Автор: DEMOVERSION 26.10.2005, 11:53
Source:
<sample a="1" b="2" type="type 1-1"> ----
<sample a="1" b="2" type="type 1-2"> 1 object
<sample a="1" b="2" type="type 1-3"> ----
<sample a="1" b="2" type="type 1-1">-----
<sample a="1" b="2" type="type 1-1">
<sample a="1" b="2" type="type 1-1"> 2 object
<sample a="1" b="2" type="type 1-1">
<sample a="1" b="2" type="type 1-3">-----
<sample a="1" b="2" type="type 1-1"> ......
....
Result:
<result object="1" c="$a[i]+$b[i]" d ="MAX($a)" .....>

obejct-u задаются по тексту, например star="type 1-1" + end = "type 1-2".

Тут надо загонять наверное все в память, а потом уже проходуть по циклу??

Автор: pvo 26.10.2005, 12:11
Цитата(DEMOVERSION @ 26.10.2005, 11:53)
obejct-u задаются по тексту, например star="type 1-1" + end = "type 1-2".

Не понял.

Цитата(DEMOVERSION @ 26.10.2005, 11:53)
Тут надо загонять наверное все в память, а потом уже проходуть по циклу??

При разборе документа уже выполняется один цикл. Поэтому, по возможности, нужно стараться избежать второго цикла.
Сделать, например, какую-нить карту, в которой ключом будет id объекта, а в значении будет сидеть структурка с необходимыми данными. Причем подсчеты нужно стараться проводить при разборе xml, если это возможно.

Автор: DEMOVERSION 26.10.2005, 12:19
Цитата(pvo @ 26.10.2005, 12:11)
Цитата(DEMOVERSION @ 26.10.2005, 11:53)
obejct-u задаются по тексту, например star="type 1-1" + end = "type 1-2".

Не понял.

Есть обьекты по каторым тоже надо делать МАХ,СУММ.... Их можна вычецлить только по заданому шаблону старта обьекта и конца.

Наверное в моем случае надо будет все загонять в масив, или какую-то колекцию??

Автор: pvo 26.10.2005, 12:34
Цитата(DEMOVERSION @ 26.10.2005, 12:19)
Их можна вычецлить только по заданому шаблону старта обьекта и конца.

понятно.


Цитата(DEMOVERSION @ 26.10.2005, 12:19)
Наверное в моем случае надо будет все загонять в масив, или какую-то колекцию??


Цитата(pvo @ 26.10.2005, 12:11)
Сделать, например, какую-нить карту, в которой ключом будет id объекта, а в значении будет сидеть структурка с необходимыми данными


Автор: Slanix 27.10.2005, 07:17
Посмотри XQuery
Простой tutorial http://www.brics.dk/~amoeller/XML/querying/listexp.html

Автор: anonymouse 27.10.2005, 10:19
Цитата
Есть обьекты по каторым тоже надо делать МАХ,СУММ.... Их можна вычецлить только по заданому шаблону старта обьекта и конца.


в этом случае посмотри надо ли тебе вообще использовать XML парсер, может быть еффективнее будет рассматривать норамльный текстовый файл. В случае с XML лучШе использовать SAXParser он работает как поток. Не о4ень удобно, но зато еффективно.

Автор: DEMOVERSION 27.10.2005, 11:45
А где писать код для XQuery?

Автор: KostenkoSergey 31.10.2005, 15:58
Для подобных задач. SAXParser - однозначно. smile
Вот тебе пример для quick starrt, тысызыть:
Код

package test;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import java.util.*;
public class MySax extends DefaultHandler {
  public MySax(){
    super();
  }
  /**
   * EVENT HANDLERS...
   */
  public void startDocument(){
    System.out.println("Начало документа");
  }
  public void endDocument(){
    System.out.println("Конец документа");
  }
  public void startElement(String uri, String name, String qName, Attributes atts){
      System.out.print("<"+name+">");
  }
  public void endElement(String uri, String name, String qName){
     System.out.println("</"+name+">");
  }

  public void characters(char ch[], int start, int lenght){
      String s = new String(ch, start, lenght).trim();
      System.out.print(s);
  }

}

Автор: hatsumeika 1.11.2005, 13:43
можно попробовать рассмотреть XSLT.
но если опыта работы с XSLT нет, а с Java есть, лучше использовать SAX.

Автор: Slanix 2.11.2005, 07:21
Цитата(DEMOVERSION @ 27.10.2005, 11:45)
А где писать код для XQuery?

Чтот значит где? Есть библиотеки. Как в случае и с SQL.
Я в своей работе использовал XML native data base eXist.
и писал что-то вроде такого:
Код

final XPathQueryServiceImpl service = (XPathQueryServiceImpl) 
                    collection.getService("XPathQueryService", "1.0");

String xq = " let $user := collection(\""+PATH+"\")/doc('users.xml')//users/user[@uid=\""+ uid +"\"]"
                                 + "let $rght := fn:data($user/right)"
                                 + "for $rights in document('users.xml')//rights/right[@name=$rght]"
                                 + " return"
                                 + " <user> {$user/@uid} {$user/@fullname} {$user/@service}"
                                 + "    {$rights}"
                                 + " </user>";

ResourceSet result = service.query(xq);


Автор: Andrey1 10.11.2005, 10:55
Цитата(DEMOVERSION @ 27.10.2005, 11:45)
А где писать код для XQuery?
Цитата(Slanix @ 2.11.2005, 07:21)
Я в своей работе использовал XML native data base eXist.

Из своего опыта могу сказать, что если:
1) Файл до 30 Mb - можно использовать просто реализацию XQuery, например, Saxon мне очень нравится (в нем же есть и реализация XSLT).
2) 30-100 Mb (ориентировочно) - eXist вполне годится.
3) >100 Mb - Sedna Native DB.

XQuery - достаточно простой и красивый язык. На нем же можно веб-программировать.

Да, и возможно все это smile smile

Автор: onsh76 11.5.2006, 00:09
Меня интересует вопрос: помогает ли удаление whitespace characters при обработке/чтении больших хмл файлов.
Существуют ли тулзы для оного удаления? 

Автор: ALKS 11.5.2006, 00:52
если струкиура XML известна и статична - JAXB. а если схема есть то вообще просто всё. 

Автор: LSD 11.5.2006, 22:33
Цитата(onsh76 @  11.5.2006,  01:09 Найти цитируемый пост)
Меня интересует вопрос: помогает ли удаление whitespace characters при обработке/чтении больших хмл файлов.

Незначительно, если там конечно не идет по 1000 пробелов подряд. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)