2015-09-17 1 views
2

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

Répondre

0

Je sais que vous utilisez SAXParser, mais devez-vous le faire? J'utilise xstream pour Java - c'est très simple. Votre classe News devrait simplement refléter le XML - chaque propriété de la classe doit avoir le même nom que la propriété XML - et vous pouvez ensuite la convertir en un objet en quelques lignes. Quelque chose comme:

public XStreamNewsBuilder() { 
    xStream = new XStream(new DomDriver()); 
    xStream.alias("dataset_news", News.class); 
    } 

    public List<News> buildNewsFromXML(String xml) { 
     return (List<News>)xStream.fromXML(xml); 
    } 

http://tomaszdziurko.pl/2013/04/xstream-xstreamely-easy-work-xml-data-java/

http://www.leveluplunch.com/java/examples/convert-xml-to-from-arraylist-object-xstream/

+0

Ok. Mais le problème n'est pas de savoir comment analyser le fichier xml. Je ne comprends pas l'erreur de NullException. –

+0

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