Je souhaite créer une base de données .sql à partir d'un jeu de données .xml. L'ensemble de données a cette structure:Créer une base de données sql à partir du fichier xml
<dataset_news>
<news>
<url>http://www.bbc.co.uk/news/uk-england-devon-32954905#sa-ns_mchannel=rss</url>
<date>Sun May 31 23:25:49 BST 2015</date>
<title>Trainee dies on Royal Marines march</title>
<desc>
A Royal Marine trainee collapses and dies on a exercise on Dartmoor.
</desc>
</news>
<news>...</news>
...
</dataset_news>
J'utilise SAX pour analyser ensemble de données. Lorsque je tente de créer la base de données SQL J'ai cette erreur:
Exception in thread "main" java.lang.NullPointerException
at ProveParsing.endElement(ProveParsing.java:59)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source)
at ProveParsing.parseXmlToDB(ProveParsing.java:89)
at ProveParsing.main(ProveParsing.java:74)
L'erreur est dans la fonction endElement (...) lorsque je tente de définir un attribut d'un générique Nouvelles. Je ne peux pas le résoudre.
Voici le code:
News.java
public class News {
private String url;
private String time;
private String title;
private String desc;
public News() {
url = "";
time = "";
title = "";
desc = "";
}
public void setUrl (String url) {
this.url = url;
}
public String getUrl() {
return url;
}
public void setTime (String time) {
this.time = time;
}
public String getTime() {
return time;
}
public void setTitle (String title) {
this.title = title;
}
public String getTitle() {
return title;
}
public void setDesc (String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("\nVALUES ('" + getUrl());
sb.append("', '" + getTime());
sb.append("', '" + getTitle());
sb.append("', '" + getDesc() + "'),");
return sb.toString();
}
}
ProveParsing.java
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.stream.XMLStreamException;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ProveParsing extends DefaultHandler {
private News news;
private String temp;
private ArrayList<News> newsList = new ArrayList<News>();
private int newsCount = 0;
public ProveParsing() throws IOException {
}
public String createTableNews() {
return "CREATE TABLE IF NOT EXISTS `news` (`idNews` VARCHAR(50) NOT NULL AUTO_INCREMENT,\n `url` TEXT NOT NULL,\n `date` DATE NOT NULL,\n `title` TEXT NOT NULL,\n `desc` TEXT NOT NULL,\n PRIMARY KEY (`idNews`));\n\n";
}
public String createInsertNews() {
return "INSERT INTO `database_news`.`news` (`url`, `date`, `title`, `desc`)\n";
}
public void startElement(String uri, String localName, String qName) {
temp = "";
if (qName.equalsIgnoreCase("news")) {
news = new News();
}
}
public void characters(char ch[], int start, int length) throws SAXException {
temp = new String(ch, start, length);
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("news")) {
newsList.add(news);
System.out.println ("News " + ++newsCount);
}
else if (qName.equalsIgnoreCase("url"))
news.setUrl(temp);
else if (qName.equalsIgnoreCase("date"))
news.setTime(temp);
else if (qName.equalsIgnoreCase("title"))
news.setTitle(temp);
else if (qName.equalsIgnoreCase("desc"))
news.setDesc(temp);
}
public ArrayList<News> getNewsList() {
return newsList;
}
public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException, XMLStreamException {
parseXmlToDB();
}
public static void parseXmlToDB() throws IOException, ParserConfigurationException, SAXException, XMLStreamException {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
ProveParsing handler = new ProveParsing();
File file = new File("data/dataset_news.xml");
InputStream inputStream = new FileInputStream(file);
Reader reader = new InputStreamReader(inputStream,"UTF-8");
InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");
saxParser.parse(is, handler);
FileWriter w = new FileWriter("data/database_news.sql");
BufferedWriter b = new BufferedWriter(w);
String table = handler.createTableNews();
String insert = handler.createInsertNews();
b.write(table);
b.write(insert);
for (int i = 0 ; i < handler.getNewsList().size() ; i++)
b.write(handler.getNewsList().get(i).toString());
b.close();
}
}
Merci !!
Ok. Mais le problème n'est pas de savoir comment analyser le fichier xml. Je ne comprends pas l'erreur de NullException. –
Je le résous! Le problema est dans la signature de startElement: public void startElement (Chaîne uri, Chaîne localName, Chaîne qName) est faux; public void startElement (Chaîne uri, Chaîne localName, Chaîne qName, Attributs attributs) est correct. –