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).

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
> ---------------------------------------------------------------------

Odpovedet emailem