Re: Help Reading XML file
On 2006-11-05 18:55:48 -0800, petedawn@gmail.com said:
mate, this code is picking up everything i need, so thats good. but its
not organising it into sections.
i mean that its picking up all attributes which are called name. i need
to be able to differentiate between b's attributes and d's attributes.
i hope i am able to explain myself, all i want to do is be able to
relate individual element attributes with their parent.
thanks.
Note this snippet of code:
public static void traverse(Node node, int level) {
// Process node here, then move on to the next child
// for example -
if (node.getParentNode().getNodeName().equals("b")) { <<<<<
// or whatever, blah blah blah <<<<<
}
// If there are any children, visit each one
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++) {
// Get child node
Node childNode = list.item(i);
// Visit child node
traverse(childNode, level + 1);
}
}
Where you see the comment // Process node here ... is where you would
put code to handle your data.
I still seriously suggest that you investigate JDOM - it was designed
specifically for _Java_ handling of XML documents (unlike DOM or SAX),
and so its methods are far easier to work with.
Some (quick and hasty) code I wrote using JDOM might show where this is easier:
public QuakeData(String rssURL, Point p)
throws IOException, JDOMException, ParseException {
// retrieve xml and build document in memory
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(rssURL);
// that's it - the entire xml file is now in memory.
// this xml has three namespaces in all, so set up the extra two
Namespace geo =
Namespace.getNamespace("geo",
"http://www.w3.org/2003/01/geo/wgs84_pos#");
Namespace dc =
Namespace.getNamespace("dc",
"http://purl.org/dc/elements/1.1/");
// some working variables
List subjects;
Element eventElement, subjectElement;
// find the root
Element root = doc.getRootElement();
// we're only interested in the the branch of the tree with "item"
// notice we can specify by _name_ here
List events = root.getChild("channel").getChildren("item");
// now that we have only the branch of the tree with "item", iterate through
// and work the data the way we want. In this case, I'm creating an
new object
// of class Event, and then setting its attributes based on the xml
data. Notice
// again I just use the name specified in the xml document - very simple:
for (Object event : events) {
QuakeEvent quakeEvent = new QuakeEvent();
eventElement = (Element) event;
quakeEvent.setPubDate(eventElement.getChildText("pubDate"));
quakeEvent.setTitle(eventElement.getChildText("title"));
quakeEvent.setDescription(eventElement.getChildText("description"));
quakeEvent.setLink(eventElement.getChildText("link"));
quakeEvent.setLocation(eventElement.getChildText("lat", geo),
eventElement.getChildText("long", geo));
subjects = eventElement.getChildren("subject", dc);
// subject as multiple occurrences, all named the same thing. I need to
// isolate them differently then previously. Depending upon their
array index,
// I set the class attribute accordingly.
for (int i = 0; i < subjects.size(); i++) {
subjectElement = (Element) subjects.get(i);
switch (i) {
case 0: {
quakeEvent.setMagnitude(subjectElement.getText());
break;
}
case 1: {
quakeEvent.setPeriod(subjectElement.getText());
break;
}
case 2: {
quakeEvent.setDepth(subjectElement.getText());
break;
}
default:
break;
}
}
// all the class attributes have been set, so now I store this object in my
// ArrayList.
quakeList.add(quakeEvent);
}
All the best to you if you keep using DOM - I gave up on it in favor of JDOM :)
Kevin