2013-12-18 4 views
1

У меня есть xml данной формы.Разберите огромный XML-файл, чтобы получить отличные значения от дочерних тегов - нужны лучшие предложения по выбору

<myData> 
    <myElement> 
      <myGroupID>ID1</myGroupID> 
      <myGroupValue>value1</myGroupValue> 
    </myElement> 
    <myElement> 
      <myGroupID>ID2</myGroupID> 
      <myGroupValue>value2</myGroupValue> 
    </myElement> 
    <myElement> 
      <myGroupID>ID3</myGroupID> 
      <myGroupValue>value3</myGroupValue> 
    </myElement> 
     <myElement> 
      <myGroupID>ID4</myGroupID> 
      <myGroupValue>value4</myGroupValue> 
    </myElement> 
     <myElement> 
      <myGroupID>ID1</myGroupID> 
      <myGroupValue>value1</myGroupValue> 
    </myElement> 
    <myElement> 
      <myGroupID>ID2</myGroupID> 
      <myGroupValue>value2</myGroupValue> 
    </myElement> 
    <myElement> 
      <myGroupID>ID3</myGroupID> 
      <myGroupValue>value3</myGroupValue> 
    </myElement> 
     <myElement> 
      <myGroupID>ID4</myGroupID> 
      <myGroupValue>value4</myGroupValue> 
    </myElement> 
<myData>  

Общее количество myElement тегов в файле может быть 2-4million, и есть другие теги в каждом из элементов. Как видно, метки myGroupID и myGroupValue имеют повторяющиеся значения для разных элементов.

Мое требование состоит в том, чтобы получить отличные значения myGroupID и myGroupValue тегов.

Я пытался использовать Stax parser with Iterator api [event based approach]. То, что я узнал, мне придется пройти через все теги, чтобы проверить, event.getLocalNamemyGroupID или myGroupValue, и если да, то мне придется использовать мою логику проверки, имеет ли уже обработанная часть файла какие-либо как значение текущего элемента.

Но при таком подходе я без необходимости повторяю другие теги [кроме myGroupID и myGroupValue], что является пустой тратой времени, как кажется.

Любая идея, как мы можем напрямую перейти к тегам с конкретными именами внутри элемента?

Не говоря уже о том, что у меня было 0 или даже меньше знаний по синтаксическому анализу stax, и у меня была возможность изучить его сегодня, и я должен использовать java для этого разбора.

Заранее благодарим за наши предложения.

Update:

Спасибо всем за ваши ценные входы. Как сейчас, я использую API-интерфейс Stax Iterator для решения этого требования, и, похоже, он работает довольно быстро. Более того, память, используемая кодом, также приемлема ~3mb, тогда как общий размер файла, который я обрабатываю, составляет 55mb. Таким образом, все будет хорошо для меня.

Всего несколько вещей, которые меня беспокоят: - XML ​​содержит leading и training пробелов и '-' character. Любые предложения о том, как мы можем избавиться от них, когда мы не разбираемся в файле, но напрямую анализируем XML, поступающий из входного потока HTTPConnection?

У меня нет выбора получения лучшего XML здесь [без leading и trailing spaces и '-' character], как XML я получаю на самом деле ответ службы из другой системы, и они не готовы изменить их код для удовлетворения требований нашей системы.

+0

Ваш первый, лучший вариант - прекратить хранить в целом целую пару данных данных, хранящихся в файле XML. : P Для этого не нужен XML, и теперь вы ждете последствий этого дизайнерского решения. – cHao

+1

Попробуйте использовать парсер vtd xml, но cHao прав в своем комментарии. – vzamanillo

+0

@cHao XML - это в основном ответ, который мы получали от службы другой системы. Спасибо за ваше предложение. Я не мог согласиться с вами больше: P –

ответ

0

Почему бы не использовать SAX? http://www.mkyong.com/java/how-to-read-xml-file-in-java-sax-parser/

public void startElement(....) { 
    if (qName.equalsIgnoreCase("myElement")) { 
     //do stuff, inElement = true, prepare new element... 
    } 

    else if (qName.equalsIgnoreCase("MYGROUPID") && inElement) { 
     //do stuff 
    } 

    else if (qName.equalsIgnoreCase("MYGROUPVALUE") && inElement) { 
     //do stuff 
    } 

Аналогическое, в EndElement(), когда закрывающая фигурная скобка «MyElement» найден, вы должны переключиться inElement ложь и магазин или делать что-нибудь еще с GroupID и groupValue взяты из текущего элемента. Это лучший способ пойти и довольно быстро - даже быстрее, чем Stax, с минимальным объемом памяти.

+1

SAX на самом деле тяжелее веса и медленнее, чем StAX. Частично это связано не с тем, что StAX не может преобразовать неиспользуемые данные в 'String', где SAX всегда должен выполнять эту обработку. –

+0

Это зависит от вашего выбора парсера и дизайна вашего приложения, но я не видел существенной разницы в скорости между SAX и StAX. SAX - это очень тщательно разработан, чтобы избежать ненужного перемещения символьных данных в строки. –

+0

Спасибо всем за ценные материалы. Как сейчас, я использую API-интерфейс Stax Iterator для решения этого требования, и, похоже, он работает довольно быстро. Кроме того, память, используемая кодом, также приемлема '~ 3mb', тогда как общий размер файла, который я обрабатываю, составляет' 55mb'. Таким образом, все будет хорошо для меня. –