LINUX.ORG.RU

[java][xml] нужна либа

 ,


0

1

задача: растопырить наружу сокет и слушать из него xml, который потом можно сериализовать (без заголовков, просто набор тегов). xstream неплохо все делал, пока не обнаружилась фича: он не может распарсить два xml-ка подрят. т.е. «<xml><field>42</field></xml>» проходит нормально, но вот «<xml><field>42</field></xml> <xml><field>42</field></xml>» уже нет, читается только первая часть. в общем-то это фича даже документированная...

видимо нужна другая либа, посоветуйте.

Ответ на: комментарий от anonymous

он самый. можно конечно и с заголовком, но нафига?

Rastafarra ★★★★
() автор топика

В xml-файле может быть только один корневой элемент. А у тебя их два, поэтому xstream считывает только первый элемент, считая, что он единственный.

anonymous
()
Ответ на: комментарий от Rastafarra
файл1+файл2=>|поток|=>файл3

парсер будет справа. как он поймет, что один файл кончился? всё верно говорят про корневые элементы, ящитаю :)

aol ★★★★★
()
Ответ на: комментарий от Rastafarra

кажется, вот он, ответ:

XML parser technology in use: You should use a streaming parser like Xpp3 or StAX. DOM-based parsers process the complete XML and create their document model in memory before the first converter of XStream is called.

раз он строит весь дом в памяти до начала разбора, то там как раз двух корневых элементов быть не могёт.

aol ★★★★★
()
Ответ на: комментарий от aol

он будет читать. закрылся последний тег? парсим этот кусок. не закрылся? ждем дальше. сам xml я могу при этом получать в любом виде.

как-то так, имхо (обозначим паузу в передачи как => ):

<xml> => <fi => eld>4 => 2</field></xm => l> <xml>

получили пару <начало></начало>, распарсили, выдали объект. при этом видимо еще один тег начала, ждем следующий xml. неужто я хочу странного!?

Rastafarra ★★★★
() автор топика

нужен костыль:

1) read <xml-root>

2) read one file

....

n-1) read last file

n) read </xml-root>

как то так

_________

//wfrr

anonymous
()
Ответ на: комментарий от Rastafarra

то что ты хочешь нарушает саму убогую концепцию xml, т.е. тебе либо надо ей следоавать либо сбрасывать сосстояние парсера посреди потока.

_________

//wfrr

anonymous
()

Ну ты протокол вначале реализуй нормально, потом уже по нему передавай свой XML. За основу можно взять что-то вроде Google Protocol Buffers, или вообще самому в стиле <lengh><data>

dizza ★★★★★
()
Ответ на: комментарий от dizza

> Ну ты протокол вначале реализуй нормально, потом уже по нему передавай свой XML.

непонял. мне клиент шлет всякое, этот xml и есть протокол.

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Rastafarra

>непонял. мне клиент шлет всякое, этот xml и есть протокол.

мне сложно представить как клиент шлет такое: «<xml> => <fi => eld>4 => 2</field></xm => l> <xml>»

это продакшен такой или задача теоретическая?

Donnie_Darko
()
Ответ на: комментарий от Donnie_Darko

> мне сложно представить как клиент шлет такое

а в чем проблема? открой порт, я тебе такое зашлю как нефиг нафиг. школота? :)

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Rastafarra

>школота? :)

почти. (первак)
и как часто такое применяется и зачем? (мне серьезно интересно)
и почему нельзя использовать REST/RPC?

Donnie_Darko
()
Ответ на: комментарий от Donnie_Darko

> и как часто такое применяется и зачем? (мне серьезно интересно)

да повсеместно. попробуй написать потоковый парсер, все станет очевидно.

вот когда тебе приходит кусок одного пакета, потом другой пакет целиком и только затем оставшаяся часть первого — вот это забавно.

моя же задача имхо должна была быть решена 100500 раз. и я искренне не понимаю почему я этого не могу нагуглить.

Rastafarra ★★★★
() автор топика
Ответ на: комментарий от Donnie_Darko

смешались в кучу кони люди, протоколы парадигмы, хэмээли и идеи.

_________

//wfrr

anonymous
()
Ответ на: комментарий от Rastafarra

>вот когда тебе приходит кусок одного пакета, потом другой пакет целиком и только затем оставшаяся часть первого

I и II пакет от разных клиентов?

Donnie_Darko
()
Ответ на: комментарий от Rastafarra

потому шо нарушает парадигму хмэля. и вотще что тебе мешает по закрытии тега на томже потоке создавать новый XMLStreamReader вызовом createXMLStreamReader ?

_________

//wfrr

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.