xml, dom, java - Java - Programmation
Marsh Posté le 03-01-2003 à 16:56:05
g voulu poster mon fichier en entier mais le forum fait un bug ?!?
Marsh Posté le 03-01-2003 à 16:57:07
package xml;
import connexion.*;
import java.sql.*;
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public class extract extends Object {
static Connection bdc;
public static void main (String args[]){
//Create the Document object
Document mapDoc = null;
//Define a new Document object
Document dataDoc = null;
//Create the new Document
Document newDoc = null;
try {
//Create the DocumentBuilderFactory
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
//Create the DocumentBuilder
DocumentBuilder docbuilder = dbfactory.newDocumentBuilder();
//Parse the file to create the Document
mapDoc = docbuilder.parse("mapping.xml" );
//Instantiate a new Document object
dataDoc = docbuilder.newDocument();
//Instantiate the new Document
newDoc = docbuilder.newDocument();
} catch (Exception e) {
System.out.println("Problem creating document: "+e.getMessage());
}
Element mapRoot = mapDoc.getDocumentElement();
//Retrieve the (only) data element and cast it to Element
Node dataNode = mapRoot.getElementsByTagName("data" ).item(0);
Element dataElement = (Element)dataNode;
System.out.println(Element.TEXT_NODE);
//Retrieve the sql statement
String sql = dataElement.getAttribute("sql" );
//Output the SQL statement
System.out.println(sql);
ResultSetMetaData resultmetadata = null;
//Create a new element called "data"
Element dataRoot = dataDoc.createElement("data" );
try{
connexion maConnexion = new connexion();
Class.forName("org.hsqldb.jdbcDriver" );
String url = maConnexion.getConnexion();
String user = maConnexion.getUser();
String pass = maConnexion.getPass();
bdc=DriverManager.getConnection(url,user,pass);
Statement monState = bdc.createStatement();
ResultSet mesRes = monState.executeQuery("select * from client" );
resultmetadata = mesRes.getMetaData();
int numCols = resultmetadata.getColumnCount();
while (mesRes.next()) {
//For each row of data
//Create a new element called "row"
Element rowEl = dataDoc.createElement("row" );
for (int i=1; i <= numCols; i++) {
//For each column, retrieve the name and data
String colName = resultmetadata.getColumnName(i);
System.out.println(colName);
String colVal = mesRes.getString(i);
System.out.println(colVal);
//If there was no data, add "and up"
if (mesRes.wasNull()) {
colVal = "and up";
}
//Create a new element with the same name as the column
Element dataEl = dataDoc.createElement(colName);
//Add the data to the new element
dataEl.appendChild(dataDoc.createTextNode(colVal));
//Add the new element to the row
rowEl.appendChild(dataEl);
}
//Add the row to the root element
dataRoot.appendChild(rowEl);
}
}
catch (Exception e) {
System.out.println("SQL Error: "+e.getMessage());
} finally {
System.out.println("Closing connections..." );
try {
bdc.close();
} catch (SQLException e) {
System.out.println("Can't close connection." );
}
}
//Add the root element to the document
dataDoc.appendChild(dataRoot);
System.out.println("Test1" );
//Retrieve the root element (also called "root" )
Element newRootInfo = (Element)mapRoot.getElementsByTagName("root" ).item(0);
System.out.println("Test2" );
//Retrieve the root and row information
String newRootName = newRootInfo.getAttribute("name" );
System.out.println("Test3" );
String newRowName = newRootInfo.getAttribute("rowName" );
System.out.println("Test4" );
//Retrieve information on elements to be built in the new document
NodeList newNodesMap = mapRoot.getElementsByTagName("element" );
System.out.println("Test5" );
//Create the final root element with the name from the mapping file
Element newRootElement = newDoc.createElement(newRootName);
System.out.println("Test6" );
//Retrieve all rows in the old document
NodeList oldRows = dataRoot.getElementsByTagName("row" );
System.out.println("Test7" );
for (int i=0; i < oldRows.getLength(); i++){
//Retrieve each row in turn
Element thisRow = (Element)oldRows.item(i);
//Create the new row
Element newRow = newDoc.createElement(newRowName);
for (int j=0; j < newNodesMap.getLength(); j++) {
//For each node in the new mapping, retrieve the information
//First the new information...
Element thisElement = (Element)newNodesMap.item(j);
System.out.println("Test6" );
String newElementName = thisElement.getAttribute("name" );
//Then the old information
Element oldElement = (Element)thisElement.getElementsByTagName("content" ).item(0);
System.out.println("Test7" );
String oldField = oldElement.getFirstChild().getNodeValue();
//Get the original values based on the mapping information
Element oldValueElement = (Element)thisRow.getElementsByTagName(oldField).item(0);
System.out.println("Test8" );
String oldValue = oldValueElement.getFirstChild().getNodeValue();
System.out.println("Test9" );
//Create the new element
Element newElement = newDoc.createElement(newElementName);
newElement.appendChild(newDoc.createTextNode(oldValue));
//Retrieve list of new elements
NodeList newAttributes = thisElement.getElementsByTagName("attribute" );
System.out.println("Test10" );
for (int k=0; k < newAttributes.getLength(); k++) {
//For each new attribute
//Get the mapping information
Element thisAttribute = (Element)newAttributes.item(k);
String oldAttributeField = thisAttribute.getFirstChild().getNodeValue();
String newAttributeName = thisAttribute.getAttribute("name" );
//Get the original value
oldValueElement = (Element)thisRow.getElementsByTagName(oldAttributeField).item(0);
String oldAttributeValue = oldValueElement.getFirstChild().getNodeValue();
//Create the new attribute
newElement.setAttribute(newAttributeName, oldAttributeValue);
}
System.out.println("Test11" );
//Add the new element to the new row
newRow.appendChild(newElement);
}
//Add the new row to the root
newRootElement.appendChild(newRow);
}
//Add the new root to the document
newDoc.appendChild(newRootElement);
}
}
Marsh Posté le 03-01-2003 à 17:04:33
voici mon fichier mapping.xml ...
Désolé pour ceux qui aiment pas lire ...
<?xml version="1.0"?>
<mapping>
<data sql="select * from client" />
<root name="lesClients" rowName="client">
<element name="description">
<attribute name="id">id</attribute>
<content>nom</content>
</element>
<element name="prenom">
<content>prenom</content>
</element>
<element name="adresse">
<content>adresse</content>
</element>
<element name="cp">
<content>cp</content>
</element>
<element name="ville">
<content>ville</content>
</element>
<element name="pays">
<content>pays</content>
</element>
<element name="tel">
<content>tel</content>
</element>
<element name="email">
<content>email</content>
</element>
</root>
</mapping>
Marsh Posté le 03-01-2003 à 17:44:11
Marsh Posté le 03-01-2003 à 18:54:41
Bon a part ça, y a personne qui connait une methode pour extraire des données d'une BD vers un fichier XML et vice-versa.
En utilisant Sax ? non ?
Marsh Posté le 04-01-2003 à 13:40:09
castor XML
il te fait le mapping objet relationnel je crois et te sors les fichiers XML correspondants
Marsh Posté le 04-01-2003 à 16:04:39
Castor JDO : base de données vers Objet Java (ou l'inverse)
Castor XML : Objet Java vers XML (ou l'inverse)
donc ,en combinant les deux, tu peux (assez facilement d'ailleurs) arriver à faire ce que tu veux...
@+
Marsh Posté le 03-01-2003 à 16:54:54
Voila en faisant une petite recherche sur le forum, g trouvé un lien sur le site d'IBM qui explique comment extraire des données dans une BD et ensuite le mettre dans un fichier XML.
Mais ça marche pas
Je voudrais savoir d'où viens le pb ...
Car c pas ma bd car il extrait bien les données ...
Il fait un "Java.lang.NullPointerException at xml.extract.main(extract.java:143)"
Voici le fichier
:
..
//Get the original values based on the mapping information
Element oldValueElement = (Element)thisRow.getElementsByTagName(oldField).item(0);
String oldValue = oldValueElement.getFirstChild().getNodeValue();// <=ET LA C LE DRAME !
//Create the new element
Element newElement = newDoc.createElement(newElementName);
newElement.appendChild(newDoc.createTextNode(oldValue));
//Retrieve list of new elements
NodeList newAttributes = thisElement.getElementsByTagName("attribute" );
System.out.println("Test10" );
for (int k=0; k < newAttributes.getLength(); k++) {
//For each new attribute
//Get the mapping information
Element thisAttribute = (Element)newAttributes.item(k);
String oldAttributeField = thisAttribute.getFirstChild().getNodeValue();
String newAttributeName = thisAttribute.getAttribute("name" );
//Get the original value
oldValueElement = (Element)thisRow.getElementsByTagName(oldAttributeField).item(0);
String oldAttributeValue = oldValueElement.getFirstChild().getNodeValue();
//Create the new attribute
newElement.setAttribute(newAttributeName, oldAttributeValue);
}
System.out.println("Test11" );
//Add the new element to the new row
newRow.appendChild(newElement);
}
//Add the new row to the root
newRootElement.appendChild(newRow);
}
//Add the new root to the document
newDoc.appendChild(newRootElement);
}
}