Dne 1. září 2010 15:48 Kamil Podlesak <[email protected]> napsal(a): > Ono se to nezdá, ale používání stále jediné datové struktury (místo > vytváření nových) ušetří hodně práce garbage collectoru a u opravdu > obrovských xml to bude znát (dokonce by mohlo dojít OutOfMemoryError).
Nesouhlasím. U opravdu velkých XML (řádově stovky MB a více) není konstrukce objektové reprezentace XML vůbec žádoucí a tedy pro tento případ je HashMapa na atributy získávaná pomocí PullParseru ideálním řešením. A dobrý Pull Parser používá pool, takže se akorát přesunou Stringy. Doufám, že takto funguje STAX (JSR 173). Nikdy jsem jiný než Systinetí PullParser nepoužíval - od dob Systinetu jsem nedělal s velkými XML. > Kamil Podlešák > > 2010/9/1 Tomáš Procházka <[email protected]>: >> Díky za tip. Zajímavé, že to v 99% funguje takto naprosto v pořádku, >> kopírovat všechny atributy do hashmapy pro každý XML element mi příjde jako >> zbytečnost, když už to je vše v instanci Attributes :-( >> >> >> --------------------------- Původní zpráva --------------------------- >> Odesilatel: Kamil Podlesak <[email protected]> >> Předmět: Divná chyba v SAX parseru? >> Datum: 1. září 2010, 11:25:40 (GMT +0200) >> Přílohy: <none> >> msgid:[email protected] >> >> K> Zdravím, >> >> K> Nejedná se o chybu, v dokumentaci (javadoc k metodě startElement, od >> K> verze 1.5 výše) je napsáno: >> >> K> atts - the attributes attached to the element. If there are no >> K> attributes, it shall be an empty Attributes object. The value of this >> K> object after startElement returns is undefined >> >> K> Ta poslední věta je klíčová: data z těch atributů si musíte "vytahat" >> K> do nějaké vlastní struktury. >> >> K> Kamil Podlešák >> >> K> 2010/9/1 Tomáš Procházka <[email protected]>: >>>> Zdravím. >> >>>> Setkal se už někdo s tím, že si standardní SAX parser v JDK 1.6 >>>> (konkrétně >>>> mám 1.6.0.18) vymýšlí neexistující hodnota atributů v XML? >> >>>> Konkrétně mám XML, které obsahuje kromě jiného asi 20 000 takovýchto >>>> elementů? >>>> <replace key="...">...</replace> například <replace >>>> key="unsubscribe">http://nekde.cz/neco.html</replace> >> >>>> V SAX handleru, bez jakéhokoliv knihovny, jen v samotné Javě. >> >>>> V handleru pak v metod >> >>>> public void startElement() si pak pouze uložím do třídních proměnných >>>> atributy tagu a nuluju StringBuffer >> >>>> this.value.setLength(0); >>>> this.attributes = attributes; >> >>>> v endElement() pak ukládám do mapy vždy hodnotu atributu key a obsah >>>> celého >>>> elementu, tedy: >> >>>> someMap.put(attributes.getValue("key"), value.toString()); >> >>>> všechno funguje, až na to, že zhruba v 300 případech z těch 20 000 >>>> elementů >>>> se přečte úplně jiný klíč, přípustné hodnoty jsou jen unsubscribe a link >>>> a v >>>> těch 300 případech tam je něco jako " <" >> >>>> Což je samozřejmě nepřípustné >> >> >>>> Zkoušel jsem za >> >>>> this.attributes = attributes; >> >>>> přidat >> >>>> if (attributes.getValue(0) != null && >>>> !"link".equals(attributes.getValue(0)) >>>> && !"unsubscribe".equals(attributes.getValue(0))) { >>>> logger.error("-------- '" + attributes.getValue(0) + "'"); >>>> } >> >>>> abych si zalogoval všechny případy kdy k tomu dojde a přestalo to dělat, >>>> téměř úplně >> >>>> Takové chování VM vůbec nechápu. Kdyby to dělalo jen na jednom stroji, >>>> tak >>>> řeknu, že je něco rozbité na něm. Jenže na ten problém jsme přišli na >>>> Linuxovém serveru a bez problémů jsem ho napodobil i na Windows stroji. >>>> navíc import ještě probíhá jen v jednom vlákně. >> >> >> >>>> Datum: 9:38:09 1. září 2010 >>>> -- >>>> --------------------------------------------------------------------- >>>> Tomáš Procházka >> >> >>>> E-mail: [email protected] >>>> WWW: http://www.atomsoft.cz >>>> ICQ: 87147320 >>>> --------------------------------------------------------------------- >> >> >> ------------------------ Konec původní zprávy ------------------------ >> >> -- >> --------------------------------------------------------------------- >> Tomáš Procházka >> >> >> E-mail: [email protected] >> WWW: http://www.atomsoft.cz >> ICQ: 87147320 >> --------------------------------------------------------------------- > -- Oto 'tapik' Buchta, [email protected], http://tapikuv.blogspot.com
