0

Hi!
I'm a java rookie and I'm trying to learn how to read and write to xml documents. I have a xml-file called tasklist which lies directly in the src directory, at the same level as the executing program but I get the following error:

java.io.FileNotFoundException: tasklist.xml (Det går inte att hitta filen)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at nr.xml.stax.read.StaXParser.readTasks(StaXParser.java:35)
at TestRead.main(TestRead.java:9)

and here's the code:

import java.util.List;

import nr.xml.stax.model.Task;
import nr.xml.stax.read.StaXParser;

public class TestRead {
	public static void main(String args[]) {
		StaXParser read = new StaXParser();
		List<Task> readTasks = read.readTasks("tasklist.xml");
		for (Task task : readTasks) {
			System.out.println(task);
		}
	}
}

As I said is the two files in the same directory so I just can't understand why it won't find the file!

All help and comments are welcome!

2
Contributors
19
Replies
20
Views
6 Years
Discussion Span
Last Post by gunnarflax
Featured Replies
  • Well there is many ways to resolve this Tou can do this [CODE] InputStream in = getClass().getResourceAsStream(taskFile); [/CODE] instead of [CODE] in= new FileInputStream(taskFile); [/CODE] And call the readTasks function without slash: [CODE] readTasks("yourfile.xml"); [/CODE] here is assumed that all the files are in the same package as you note … Read More

  • It works too. [CODE] import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.xml.stream.XMLEventReader; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.Attribute; import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; //import nr.xml.stax.model.Task; public class StaxParser { static final String DATE = "date"; static final String TASK = "task"; static final … Read More

0

So whold you give some information about the readTasks function; or the StaXParser class please!

0

The StaxParser is based on a tutorial with some slight naming modifications. The code is:

package nr.xml.stax.read;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import nr.xml.stax.model.Task;

public class StaxParser {
	static final String DATE = "date";
	static final String ITEM = "item";
	static final String MODE = "mode";
	static final String UNIT = "unit";
	static final String CURRENT = "current";
	static final String INTERACTIVE = "interactive";

	@SuppressWarnings({ "unchecked", "null" })
	public List<Task>  readTasks(String taskFile) {
		List<Task> tasks = new ArrayList<Task>();
		try {
			// First create a new XMLInputFactory
			XMLInputFactory inputFactory = XMLInputFactory.newInstance();
			// Setup a new eventReader
			InputStream in = new FileInputStream(taskFile);
			XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
			// Read the XML document
			Task task = null;

			while (eventReader.hasNext()) {
				XMLEvent event = eventReader.nextEvent();

				if (event.isStartElement()) {
					StartElement startElement = event.asStartElement();
					// If we have a item element we create a new item
					if (startElement.getName().getLocalPart().equals(ITEM)) {
						task = new Task();
						// We read the attributes from this tag and add the date attribute to our object
						Iterator<Attribute> attributes = startElement
								.getAttributes();
						while (attributes.hasNext()) {
							Attribute attribute = attributes.next();
							if (attribute.getName().toString().equals(DATE));
							task.setDate(attribute.getValue());
						}
					}

					if (event.isStartElement()) {
						if (event.asStartElement().getName().getLocalPart()
								.equals(MODE)) {
							event = eventReader.nextEvent();
							task.setMode(event.asCharacters().getData());
							continue;
						}
					}
					if (event.asStartElement().getName().getLocalPart().equals(UNIT)) {
						event = eventReader.nextEvent();
						task.setUnit(event.asCharacters().getData());
						continue;
					}

					if (event.asStartElement().getName().getLocalPart().equals(CURRENT)) {
						event = eventReader.nextEvent();
						task.setCurrent(event.asCharacters().getData());
						continue;
					}

					if (event.asStartElement().getName().getLocalPart().equals(INTERACTIVE)) {
						event = eventReader.nextEvent();
						task.setInteractive(event.asCharacters().getData());
						continue;
					}
				}
				// If we reach the end of an item element we add it to the list
				if (event.isEndElement()){
					EndElement endElement = event.asEndElement();
					if (endElement.getName().getLocalPart().equals(ITEM)){
						tasks.add(task);
					}
				}

			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
		return tasks;
	}

}

and the Task class looks like this:

package nr.xml.stax.model;

public class Task {
	private String date;
	private String mode;
	private String unit;
	private String current;
	private String interactive;

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}
	public String getMode() {
		return mode;
	}
	public void setMode(String mode) {
		this.mode = mode;
	}
	public String getUnit() {
		return unit;
	}
	public void setUnit(String unit) {
		this.unit = unit;
	}
	public String getCurrent() {
		return current;
	}
	public void setCurrent(String current) {
		this.current = current;
	}
	public String getInteractive() {
		return interactive;
	}
	public void setInteractive(String interactive) {
		this.interactive = interactive;
	}

	@Override
	public String toString() {
		return "Item [current=" + current + ", date=" + date + ", interactive="
				+ interactive + ", mode=" + mode + ", unit=" + unit + "]";
	}
}

The Task class is still the unmodified code from the tutorial since I haven't gotten it to work yet.

1

Well there is many ways to resolve this
Tou can do this

InputStream in = getClass().getResourceAsStream(taskFile);

instead of

in= new FileInputStream(taskFile);

And call the readTasks function without slash:

readTasks("yourfile.xml");

here is assumed that all the files are in the same package as you note before.

Hope it helps.

0

I looked through the code and saw that it wasn't adjusted enough for my program so I made a whole lot of changes and now I don't get the error any longer! Thanks for your time! But I still can't get it to write out the content but that is a problem I will look into myself first :) thank you very much!

0

Ok, now I've made some major modifications so that it should work properly but when the code comes to the part with all the if's:

if (startElement.getName().getLocalPart().equals(TASK)) { //Here I've tried with System.out.println("!"); but nothing gets printed

None of the if-statements return true. Even though the getLocalPart should return the same as my ITEM variable. any ideas? I'll post the updated StaxParser code below:

package nr.xml.stax.read;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import nr.xml.stax.model.Task;

public class StaxParser {
	static final String DATE = "date";
	static final String TASK = "task";
	static final String DEADLINE = "deadline";
	static final String PRIORITY = "priority";
        static final String DESCRIPTION = "description";

	@SuppressWarnings({ "unchecked", "null" })
	public List<Task> readTasks(String taskFile){
		List<Task> tasks = new ArrayList<Task>();

		try {
			// First create a new XMLInputFactory
			XMLInputFactory inputFactory = XMLInputFactory.newInstance();
			// Setup a new eventReader
			InputStream in = new FileInputStream(taskFile);
			XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
			// Read the XML document
			Task task = null;

			while (eventReader.hasNext()) {
				XMLEvent event = eventReader.nextEvent();

				if (event.isStartElement()) {
					StartElement startElement = event.asStartElement();
					// If we have a task element we create a new task
					if (startElement.getName().getLocalPart().equals(TASK)) {
						task = new Task();
						// We read the attributes from this tag and add the date attribute to our object
						Iterator<Attribute> attributes = startElement
								.getAttributes();
						while (attributes.hasNext()) {
							Attribute attribute = attributes.next();
							if (attribute.getName().toString().equals(DATE));
                                                            System.out.println(attribute.getValue());
							task.setDate(attribute.getValue());
						}
					}
					if (event.asStartElement().getName().getLocalPart().equals(DEADLINE)) {
						event = eventReader.nextEvent();
						task.setDeadline(event.asCharacters().getData());
						continue;
					}
					if (event.asStartElement().getName().getLocalPart().equals(PRIORITY)) {
						event = eventReader.nextEvent();
						task.setPriority(event.asCharacters().getData());
						continue;
					}
                                        if (event.asStartElement().getName().getLocalPart().equals(DESCRIPTION)) {
						event = eventReader.nextEvent();
						task.setDesc(event.asCharacters().getData());
						continue;
					}

				}
				// If we reach the end of an item element we add it to the list
				if (event.isEndElement()){
					EndElement endElement = event.asEndElement();
					if (endElement.getName().getLocalPart().equals(TASK)){
						tasks.add(task);
					}
				}

			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
		return tasks;
	}

}

Edited by gunnarflax: n/a

0

I should probably post the xml as well to see if the structure is wrong:

<?xml version="1.0" encoding="UTF-8"?>
<tasklist>
    <task date="2007-12-01">
        <deadline>2010-10-01</deadline>
        <priority>2</priority>
        <description>Fixa TODOList programmet!</description>
    </task>
    <task date="2007-12-24">
        <deadline>2010-10-01</deadline>
        <priority>2</priority>
        <description>Ett test med ett till inlägg!</description>
    </task>
</tasklist>
0

Hi again;
it seem that it works for me:

public class StaxParser {
	static final String DATE = "date";
	static final String TASK = "task";
	static final String DEADLINE = "deadline";
	static final String PRIORITY = "priority";
        static final String DESCRIPTION = "description";

	@SuppressWarnings({ "unchecked", "null" })
	public List<Task> readTasks(String taskFile){
		List<Task> tasks = new ArrayList<Task>();

		try {
			// First create a new XMLInputFactory
			XMLInputFactory inputFactory = XMLInputFactory.newInstance();
			// Setup a new eventReader
			InputStream in = this.getClass().getResourceAsStream(taskFile);
			XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
			// Read the XML document
			Task task = null;

			while (eventReader.hasNext()) {
				XMLEvent event = eventReader.nextEvent();

				if (event.isStartElement()) {
					StartElement startElement = event.asStartElement();
					// If we have a task element we create a new task
                                        
					if (startElement.getName().getLocalPart().equals(TASK)) {
                                            System.out.println(startElement.getName().getLocalPart());
						task = new Task();
						// We read the attributes from this tag and add the date attribute to our object
						Iterator<Attribute> attributes = startElement
								.getAttributes();
						while (attributes.hasNext()) {
							Attribute attribute = attributes.next();
							if (attribute.getName().toString().equals(DATE));
                                                            System.out.println(attribute.getValue());
							task.setDate(attribute.getValue());
						}
					}
					if (event.asStartElement().getName().getLocalPart().equals(DEADLINE)) {
						event = eventReader.nextEvent();
						//task.setDeadline(event.asCharacters().getData());
						continue;
					}
					if (event.asStartElement().getName().getLocalPart().equals(PRIORITY)) {
						event = eventReader.nextEvent();
						//task.setPriority(event.asCharacters().getData());
						continue;
					}
                                        if (event.asStartElement().getName().getLocalPart().equals(DESCRIPTION)) {
						event = eventReader.nextEvent();
						//task.setDesc(event.asCharacters().getData());
						continue;
					}

				}
				// If we reach the end of an item element we add it to the list
				if (event.isEndElement()){
					EndElement endElement = event.asEndElement();
					if (endElement.getName().getLocalPart().equals(TASK)){
						tasks.add(task);
					}
				}

			}
		} /*catch (FileNotFoundException e) {
                e.printStackTrace();
                }*/ catch (XMLStreamException e) {
			e.printStackTrace();
		}
		return tasks;
	}

}

I'll see with the xml file you sent.

0

Hey! Now it works! Apparently I had to write the src as "src/tasklist.xml". Why is that? Why does it look for "tasklist.xml" outside of the source?

1

It works too.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

//import nr.xml.stax.model.Task;
public class StaxParser {

    static final String DATE = "date";
    static final String TASK = "task";
    static final String DEADLINE = "deadline";
    static final String PRIORITY = "priority";
    static final String DESCRIPTION = "description";

    @SuppressWarnings({"unchecked", "null"})
    public List<Task> readTasks(String taskFile) {
        List<Task> tasks = new ArrayList<Task>();

        try {
            // First create a new XMLInputFactory
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();
            // Setup a new eventReader
            InputStream in = this.getClass().getResourceAsStream(taskFile);
            XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
            // Read the XML document
            Task task = null;

            while (eventReader.hasNext()) {
                XMLEvent event = eventReader.nextEvent();

                if (event.isStartElement()) {
                    StartElement startElement = event.asStartElement();
                    // If we have a task element we create a new task

                    if (startElement.getName().getLocalPart().equals(TASK)) {
                        System.out.println(startElement.getName().getLocalPart());
                        task = new Task();
                        // We read the attributes from this tag and add the date attribute to our object
                        Iterator<Attribute> attributes = startElement.getAttributes();
                        while (attributes.hasNext()) {
                            Attribute attribute = attributes.next();
                            if (attribute.getName().toString().equals(DATE));
                            System.out.println(attribute.getValue());
                            task.setDate(attribute.getValue());
                        }
                    }
                    if (event.asStartElement().getName().getLocalPart().equals(DEADLINE)) {
                        event = eventReader.nextEvent();
                       [B] // please here I commented this instruction for debuging task.setDeadline(event.asCharacters().getData());[/B]
                        continue;
                    }
                    if (event.asStartElement().getName().getLocalPart().equals(PRIORITY)) {
                        event = eventReader.nextEvent();
                        //task.setPriority(event.asCharacters().getData());
                        continue;
                    }
                    if (event.asStartElement().getName().getLocalPart().equals(DESCRIPTION)) {
                        event = eventReader.nextEvent();
                        //task.setDesc(event.asCharacters().getData());
                        continue;
                    }

                }
                // If we reach the end of an item element we add it to the list
                if (event.isEndElement()) {
                    EndElement endElement = event.asEndElement();
                    if (endElement.getName().getLocalPart().equals(TASK)) {
                        tasks.add(task);
                    }
                }

            }
        } /*catch (FileNotFoundException e) {
        e.printStackTrace();
        }*/ catch (XMLStreamException e) {
            e.printStackTrace();
        }
        return tasks;
    }
//Main for just test please remove it after teste
    public static void main(String[] args) throws FileNotFoundException {
        new StaxParser().readTasks("tasklist.xml");
    }
}

Note: I commented some instructions for debuging.
Note: the three files are in the same package.

Test it it works.

Hope it helps

0

Thank you for your time, I just recently managed to make it work as well :) Do you have any idea why the relative path must have "src/tasklist.xml" instead of just "tasklist.xml" like a I asked in my previous post?

0

I did not recognize the structure of your project but it works for me just by "fileName.xml" and I put the 3 files in the same package and by using the getResourceAsStream method.

0

But in all cases you should resolve the path by using gerRessource, or getRessourceAsStream or by using the URL class because I think that the "scr/..." will not be resolved if you make tha jar file.

0

How do I use getResourceAsStrem? Or do you want me to just google it :P

0

Hi;
Please take a look to the ocde sent in my previse post you found how to use it:

InputStream in = this.getClass().getResourceAsStream(taskFile);
            XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
0

Sorry for the late answer. Everytime I try with the getResourceAsStream method I get the following error:

run:
javax.xml.stream.XMLStreamException: java.net.MalformedURLException
        at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:218)
        at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.<init>(XMLStreamReaderImpl.java:190)
        at com.sun.xml.internal.stream.XMLInputFactoryImpl.getXMLStreamReaderImpl(XMLInputFactoryImpl.java:264)
        at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLStreamReader(XMLInputFactoryImpl.java:131)
        at com.sun.xml.internal.stream.XMLInputFactoryImpl.createXMLEventReader(XMLInputFactoryImpl.java:80)
        at nr.xml.stax.read.StaxParser.readTasks(StaxParser.java:36)
        at TaskTableModel.updateContent(TaskTableModel.java:34)
        at Test.<init>(Test.java:56)
        at Test.main(Test.java:89)
Caused by: java.net.MalformedURLException
        at java.net.URL.<init>(URL.java:601)
        at java.net.URL.<init>(URL.java:464)
        at java.net.URL.<init>(URL.java:413)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:650)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315)
        at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startDocumentEntity(XMLEntityManager.java:1267)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.setInputSource(XMLDocumentScannerImpl.java:281)
        at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.setInputSource(XMLStreamReaderImpl.java:205)
        ... 8 more
BUILD SUCCESSFUL (total time: 19 seconds)

Why is that? I can't get it to work. I can't fix it for the Stax Writer either. Please help!

p.s. I implemented the code just as you did:

InputStream in = this.getClass().getResourceAsStream(taskFile);
                        XMLEventReader eventReader = inputFactory.createXMLEventReader(in);

Edited by gunnarflax: n/a

0

Is it because that I have a completely different project structure? I'm trying to call this from the source folder and this is in nr/xml/stax/read/

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.