[jdom-interest] Iterating through XML
Phill_Perryman at Mitel.COM
Phill_Perryman at Mitel.COM
Tue Jul 6 06:13:22 PDT 2004
If there are a lot of elements in the list then the following from Brad I
found useful.
My XML file had 7000 child entries and the following reduced the build
time from 0.9 seconds (which the user noticed) to below 0.1 second which
they did not notice.
Don't use getChildren (which BTW was renamed to getChildElements in the
current
cvs). The list returned by getChildren is both filtered, to show only
Elements, and "live". "live" meaning changes to the list are reflected in
the
element's underlying content. One problem is a element has no way of
knowing
how many child elements it has or were they are in the content list with
scanning the underlying content list and counting. So size() in the line
for (int i = 0; i < element_list.size (); i ++)
causes element_list's actual content list to be scanned on each call,
counting
Elements and skipping any Text, Comment, or ProcessingInstruction node.
Similarly element_list.get(i) cann't determine where the i th Element is
without starting from index 0 in the underlying content list and scanning
until
it finds the i th Element or runs out of nodes.
Iterators because a certain state must be maintained between a call to
hasNext() and next() have their own slew of problems. If your interested,
search the archives for ConcurrentModificationException.
A solution to your problem in this case is to use getContent instead of
getChildren since size() is known (not calculated) by the parent element
and get(index) references the actual content list (not a filtered
version).
private void transform_document (Element parent_element) {
List list = parent_element.getContent();
int size = list.size();
for (int i = 0; i < size; i ++) {
Object node = list.get(i);
if (node instanceof Element) {
Element element = (Element) obj;
if (element.getNamespace() == orange_namespace) {
// do something ....
// replace old element
list.set(i, new_element);
}
transform_document(element);
}
}
}
/Phill
IS Dept, Software Engineer.
phill_perryman at mitel.com
http://www.mitel.com
Tel: +44 1291 436023
Laurent Bihanic <laurent.bihanic at atosorigin.com>
Sent by: jdom-interest-admin at jdom.org
06/07/2004 13:17
To: Edd Dawson <E.J.Dawson at derby.ac.uk>
cc: jdom-interest at jdom.org
Subject: Re: [jdom-interest] Iterating through XML
for (Iterator
i=doc.getRootElement().getChildren("InboundMessage").iterator();
i.hasNext(); )
{
Element inboundMessage = (Element)(i.next());
...
}
Laurent
Edd Dawson wrote:
> Hi
>
> I have got the following code :
>
> Document doc = null;
> try {
> doc = builder.build(reader);
> } catch(Exception ex) {
> return "Error on making xml returned SAXable" +
ex.getMessage();
> }
>
>
>
> Which puts my inputStream XML nicely into the parser.
>
>
> Now i have the following in there :
>
> <Response>
> <InboundMessage>
> <Ticket>1278</Ticket>
> <MessageText>Example 1</MessageText>
> <Phone>+4409878656787</Phone>
> <Date>123456123</Date>
> </InboundMessage>
> <InboundMessage>
> <Ticket>1279</Ticket>
> <MessageText>Example 2</MessageText>
> <Phone>+4409878656787</Phone>
> <Date>123456123</Date>
> </InboundMessage>
> <InboundMessage>
> <Ticket>1280</Ticket>
> <MessageText>Example 3</MessageText>
> <Phone>+4409878656787</Phone>
> <Date>123456123</Date>
> </InboundMessage>
> </Request>
>
>
>
> I can't figure out from the manuals and docs that i have read how to
> iterate through all the instances of <InboundMessage> so i can retrieve
> the elements of each and bung them in a database.
>
> Would anyone have any ideas how to do so?
>
> thanks
> Edd
>
> _______________________________________________
> To control your jdom-interest membership:
> http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com
>
--
wWw
(o o)
-------------ooO-(_)-Ooo-----------------------------------------------
Laurent Bihanic | Tel: +33 (0)1 55.91.21.93 (direct)
AtosOrigin Systems Integration | +33 (0)1 55.91.20.00
Generic Solutions / SC | Fax: +33 (0)1 55.91.22.31
Les Miroirs - Bat. C |
18, avenue d'Alsace |
F-92926 La Defense Cedex | E-mail: laurent.bihanic at atosorigin.com
-----------------------------------------------------------------------
Plonge tes racines dans la terre
Laisse nous vivre avec le vent
Passe l'hiver comme les graines
Et chante au printemps comme les oiseaux
DISCLAIMER:
The opinions expressed are entirely my own and may not necessarily be
those of my employer. Also, I am not now nor have I ever been a
lawyer. My opinions are provided as-is with absolutely no warrantee of
merchantability or fitness for any particular use. Besides, you can't
prove I typed this. No body saw me type this. Who says I typed this?
_______________________________________________
To control your jdom-interest membership:
http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://jdom.org/pipermail/jdom-interest/attachments/20040706/f5072f55/attachment.htm
More information about the jdom-interest
mailing list