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