Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Парсинг xml с массивом элементов  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Добрый день,

есть xml:

<?xml version="1.0" encoding="Windows-1251"?>	
	<BCEntry BC="103">
		<ParInfo Rn="12" Id="414056"/>
		<Accounts Account="0010" DateIn="2013-01-09" Status="AC"/>
		<Accounts Account="0011" DateIn="2013-01-09" Status="AC"/>
		<Accounts Account="0012" DateIn="2013-01-09" Status="AC"/>
		<Accounts Account="0013" DateIn="2013-01-09" Status="AC"/>
	</BCEntry>
	<BCEntry BC="597">
		<ParInfo Rn="45" Id="109240">
			<RList RDate="2016-05-17"/>
		</ParInfo>
		<Accounts Account="3010" DateIn="2015-09-14" Status="AC"/>
	</BCEntry>


Размер xml файла до 12 мб,
Из xml файла нужно забрать все данные!!

посоветуйте, какой парсер выбрать?

И второй вопрос, как распарсить массив элементов?
<Accounts ... />
9 июл 20, 15:43    [22164699]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Garrick
Member

Откуда: Москва
Сообщений: 3011
Aleks_Aleks,

Есть два вида парсеров DOM и SAX. Парсеры DOM загружают всё дерево XML в ОЗУ и позволяют осуществлять "навигацию" по дереву в любом направлении. Соответственно. размер файла ограничивается размером выделенного ОЗУ. Парсеры SAX работают только в потоке и в одном направлении, обратная навигация невозможна. Но парсеры SAX не ограничены размером ОЗУ, т.к. могут не хранить уже обработанную часть файла в памяти. Для больших файлов однозначно только SAX. Реализаций парсеров и того и другого вида больше одного, выбирайте на цвет и вкус...

Сообщение было отредактировано: 9 июл 20, 16:06
9 июл 20, 16:07    [22164715]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Garrick,

Спс,

Выбрал парсер DOM....
9 июл 20, 16:38    [22164739]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Как в парсере дом обойти массив

	
<Accounts Account="0010" DateIn="2013-01-09" Status="AC"/>
<Accounts Account="0011" DateIn="2013-01-09" Status="AC"/>
<Accounts Account="0012" DateIn="2013-01-09" Status="AC"/>
<Accounts Account="0013" DateIn="2013-01-09" Status="AC"/>
9 июл 20, 16:39    [22164740]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 8762
Aleks_Aleks
Как в парсере дом обойти массив

Так же, как и не массив

childNodes()
nextSibling()
или как-то так
9 июл 20, 16:43    [22164744]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3312
Aleks_Aleks
Добрый день,

есть xml:

<?xml version="1.0" encoding="Windows-1251"?>	
	<BCEntry BC="103">
		<ParInfo Rn="12" Id="414056"/>
		<Accounts Account="0010" DateIn="2013-01-09" Status="AC"/>
		<Accounts Account="0011" DateIn="2013-01-09" Status="AC"/>
		<Accounts Account="0012" DateIn="2013-01-09" Status="AC"/>
		<Accounts Account="0013" DateIn="2013-01-09" Status="AC"/>
	</BCEntry>
	<BCEntry BC="597">
		<ParInfo Rn="45" Id="109240">
			<RList RDate="2016-05-17"/>
		</ParInfo>
		<Accounts Account="3010" DateIn="2015-09-14" Status="AC"/>
	</BCEntry>


Размер xml файла до 12 мб,
Из xml файла нужно забрать все данные!!

посоветуйте, какой парсер выбрать?

И второй вопрос, как распарсить массив элементов?
<Accounts ... />


Могу посоветовать библиотеку из соседней ветки.

Она умеет читать xml файлы.

17790633

Хорошего вам дня!
9 июл 20, 20:38    [22164854]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Zzz79
Member

Откуда:
Сообщений: 569
Aleks_Aleks
Garrick,

Спс,

Выбрал парсер DOM....

очень зря - для портянок лучше Sax
9 июл 20, 21:17    [22164867]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Valentin Kolesnikov,

Спасибо, но не думаю что тим одобрит, если я в проект буду добавлять какую нить либу...
9 июл 20, 22:18    [22164899]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Aleks_Aleks
Member

Откуда:
Сообщений: 294
Zzz79,

ок, тогда напишу на DOM и на SAX, посмотрим что тим одобрит)
9 июл 20, 22:19    [22164902]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
SpringMan
Member

Откуда:
Сообщений: 207
Aleks_Aleks
Zzz79,

ок, тогда напишу на DOM и на SAX, посмотрим что тим одобрит)

на jaxb
9 июл 20, 23:00    [22164923]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Zzz79
Member

Откуда:
Сообщений: 569
Опасные люди) надеюсь прект хотя бы пет)
9 июл 20, 23:26    [22164935]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
mayton
Member

Откуда: loopback
Сообщений: 47968
Тут как-то семантически некрасиво.
<Accounts Account="0010" DateIn="2013-01-09" Status="AC"/>
<Accounts Account="0011" DateIn="2013-01-09" Status="AC"/>
<Accounts Account="0012" DateIn="2013-01-09" Status="AC"/>
<Accounts Account="0013" DateIn="2013-01-09" Status="AC"/>

Масло маслянное. Тег аккаунты внутри которого... атрибуты аккаунт и дата.

Надо было сделать так.
<Accounts>
 <Account Id="0011" DateIn="2013-01-09" Status="AC"/> 
 .....
9 июл 20, 23:35    [22164939]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3312
Aleks_Aleks
Valentin Kolesnikov,

Спасибо, но не думаю что тим одобрит, если я в проект буду добавлять какую нить либу...


Либа open source, MIT лицензия.

Пример решения 2-ой задачи:

              String xml = "<?xml version=\"1.0\" encoding=\"Windows-1251\"?>\n"
              + "    <root>\n"
              + "        <BCEntry BC=\"103\">\n"
              + "               <ParInfo Rn=\"12\" Id=\"414056\"/>\n"
              + "               <Accounts Account=\"0010\" DateIn=\"2013-01-09\" Status=\"AC\"/>\n"
              + "               <Accounts Account=\"0011\" DateIn=\"2013-01-09\" Status=\"AC\"/>\n"
              + "               <Accounts Account=\"0012\" DateIn=\"2013-01-09\" Status=\"AC\"/>\n"
              + "               <Accounts Account=\"0013\" DateIn=\"2013-01-09\" Status=\"AC\"/>\n"
              + "       </BCEntry>\n"
              + "       <BCEntry BC=\"597\">\n"
              + "               <ParInfo Rn=\"45\" Id=\"109240\">\n"
              + "                       <RList RDate=\"2016-05-17\"/>\n"
              + "               </ParInfo>\n"
              + "               <Accounts Account=\"3010\" DateIn=\"2015-09-14\" Status=\"AC\"/>\n"
              + "        </BCEntry>\n"
              + "    </root>";
              System.out.println(U.<List<Map<String, Object>>>get(U.fromXmlMap(xml), "root.BCEntry.0.Accounts"));
              // [{-Account=0010, -DateIn=2013-01-09, -Status=AC, -self-closing=true},
              //  {-Account=0011, -DateIn=2013-01-09, -Status=AC, -self-closing=true},
              //  {-Account=0012, -DateIn=2013-01-09, -Status=AC, -self-closing=true},
              //  {-Account=0013, -DateIn=2013-01-09, -Status=AC, -self-closing=true}]


Хорошего вам дня!

Сообщение было отредактировано: 10 июл 20, 10:43
10 июл 20, 10:45    [22165062]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Garrick
Member

Откуда: Москва
Сообщений: 3011
SpringMan
Aleks_Aleks
Zzz79,

ок, тогда напишу на DOM и на SAX, посмотрим что тим одобрит)

на jaxb


К стати да!
К JAXB можно и SAX прикрутить, а если есть XSD файл, то оно и Java классы сможет сгенерить, а уж Unmarshaling приятнее, чем в DOM ковыряться.

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/xjc.html
https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/Unmarshaller.html
https://www.oracle.com/technical-resources/articles/javase/jaxb.html
10 июл 20, 15:37    [22165353]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
mayton
Member

Откуда: loopback
Сообщений: 47968
Valentin Kolesnikov, а ты пользовался jq?
10 июл 20, 16:42    [22165387]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
Valentin Kolesnikov
Member

Откуда:
Сообщений: 3312
mayton
Valentin Kolesnikov, а ты пользовался jq?


Это С++ библиотека вообще-то.

автор
jq is like sed for JSON data - you can use it to slice and filter and map and transform structured data with the same ease that sed, awk, grep and friends let you play with text.

jq is written in portable C, and it has zero runtime dependencies.


Хорошего вам вечера!
10 июл 20, 20:43    [22165483]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг xml с массивом элементов  [new]
mayton
Member

Откуда: loopback
Сообщений: 47968
JQ использует свой собственный диалект языка запросов к JSON документу.

Что-то вроде упрощённого XPath.

Вам это было-бы интересно?
10 июл 20, 23:02    [22165536]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить