Plus rapide et optimisé de façon à lire le fichier xml
J'ai ce code XML ci-dessous le fichier de
<book>
<person>
<first>Kiran</first>
<last>Pai</last>
<age>22</age>
</person>
<person>
<first>Bill</first>
<last>Gates</last>
<age>46</age>
</person>
<person>
<first>Steve</first>
<last>Jobs</last>
<age>40</age>
</person>
</book>
maintenant le programme Java pour lire des données à partir d'un fichier XML est indiqué ci-dessous..
import java.io.File;
import org.w3c.dom.Document;
import org.w3c.dom.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class ReadAndPrintXMLFile{
public static void main (String argv []){
try {
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse (new File("book.xml"));
//normalize text representation
doc.getDocumentElement ().normalize ();
System.out.println ("Root element of the doc is " +
doc.getDocumentElement().getNodeName());
NodeList listOfPersons = doc.getElementsByTagName("person");
int totalPersons = listOfPersons.getLength();
System.out.println("Total no of people : " + totalPersons);
for(int s=0; s<listOfPersons.getLength() ; s++){
Node firstPersonNode = listOfPersons.item(s);
if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE){
Element firstPersonElement = (Element)firstPersonNode;
//-------
NodeList firstNameList = firstPersonElement.getElementsByTagName("first");
Element firstNameElement = (Element)firstNameList.item(0);
NodeList textFNList = firstNameElement.getChildNodes();
System.out.println("First Name : " +
((Node)textFNList.item(0)).getNodeValue().trim());
//-------
NodeList lastNameList = firstPersonElement.getElementsByTagName("last");
Element lastNameElement = (Element)lastNameList.item(0);
NodeList textLNList = lastNameElement.getChildNodes();
System.out.println("Last Name : " +
((Node)textLNList.item(0)).getNodeValue().trim());
//----
NodeList ageList = firstPersonElement.getElementsByTagName("age");
Element ageElement = (Element)ageList.item(0);
NodeList textAgeList = ageElement.getChildNodes();
System.out.println("Age : " +
((Node)textAgeList.item(0)).getNodeValue().trim());
//------
}//end of if clause
}//end of for loop with s var
}catch (SAXParseException err) {
System.out.println ("** Parsing error" + ", line "
+ err.getLineNumber () + ", uri " + err.getSystemId ());
System.out.println(" " + err.getMessage ());
}catch (SAXException e) {
Exception x = e.getException ();
((x == null) ? e : x).printStackTrace ();
}catch (Throwable t) {
t.printStackTrace ();
}
//System.exit (0);
}//end of main
}
et le résultat était ..
Root element of the doc is book
Total no of people : 3
First Name : Kiran
Last Name : Pai
Age : 22
First Name : Bill
Last Name : Gates
Age : 46
First Name : Steve
Last Name : Jobs
Age : 40
Maintenant ma question est s'il vous plaît informer est-il un autre moyen qui est le plus rapide pour lire ce document xml , je cherchais les fastes , Veuillez en informer..!!
rapide et xml en général ne vont pas ensemble. traitement de texte est généralement lente.
Vous devriez préférer SAX DOM.
StAX (JSR-123) serait plus rapide que SAX.
Merci beaucoup mec , pourriez-vous s'il vous plaît convertir mon programme ci-dessus dans votre mise en œuvre de Stax, de sorte que je peux comprendre en détail trop..!!
Tout d'abord, vous devez déterminer OÙ il est lent au lieu de se demander qui est le moyen le plus rapide pour lire le fichier XML...tout le temps que vous voulez pour améliorer les performances, vous devez commencer par identifier les endroits où le programme s'exécute lentement et à partir de là...alors, à quel point ce programme est-il trop lent?
Vous devriez préférer SAX DOM.
StAX (JSR-123) serait plus rapide que SAX.
Merci beaucoup mec , pourriez-vous s'il vous plaît convertir mon programme ci-dessus dans votre mise en œuvre de Stax, de sorte que je peux comprendre en détail trop..!!
Tout d'abord, vous devez déterminer OÙ il est lent au lieu de se demander qui est le moyen le plus rapide pour lire le fichier XML...tout le temps que vous voulez pour améliorer les performances, vous devez commencer par identifier les endroits où le programme s'exécute lentement et à partir de là...alors, à quel point ce programme est-il trop lent?
OriginalL'auteur user1633823 | 2012-09-04
Vous devez vous connecter pour publier un commentaire.
À l'aide de
ReadAndPrintXMLFileWithStAX
ci-dessous, quand je compare avecReadAndPrintXMLFileWithSAX
de la réponse donnée par gontard le StAX approche est plus rapide. Mon test a porté sur l'exécution à la fois un exemple de code500000
fois sur JDK 1.7.0_07 pour le Mac.ReadAndPrintXMLFileWithStAX (à l'aide de Java SE 7)
Ci-dessous est un plus optimisé StAX (JSR-173) exemple d'utilisation de
XMLStreamReader
au lieu deXMLEventReader
.Sortie
n
timeswith très peu de fichiers mais sur un fichier très volumineux, sinon trop de temps est passé sur la machine de chargement. En plus de cela, la suppression de tous les impression de la console est important, car ils sont très coûteux.J'ai essayé votre code sur ma "référence" et effectivement
StAX
est plus rapide queSAX
. J'ai été surpris, j'ai donc essayer de l'expliquer dans ma réponse. Veuillez prendre un coup d'oeil et me donner vos commentaires.Hey, bon à savoir. C'est un peu plus propre aussi.
OriginalL'auteur Blaise Doughan
Si les performances sont importantes dans votre cas, vous devriez préférer SAXOPHONE ou StAX(http://en.wikipedia.org/wiki/StAX) pour DOM.
Avec
DOM
, dans un premier temps leXML
fichier est analysé dans un modèle objet, alors vous avez peut lui demander. Donc pour vous, algorithme, il y a deux pass.Avec
SAX
, au cours de l'analyse, quelques rappels sont invoquées (startDocument
,endElement
...),SAX
est basé sur un événement ou un modèle push.Avec
StAX
, vous contrôlez l'analyse. Vous déplacez un curseur à partir d'un élément à un autre. C'est un modèle d'extraction.Avec un fichier contenant 32910000 personnes , je compare ma version avec
SAX
à plus de réponse (de Blaise Doughan) avecStAX
. J'ai supprimer tous lesSystem.out.println
instrusctions. Mon programme a eu 106 secondes pour lire tous les fichiers et les autres, d'94 secondes.Je suppose que
SAX
est plus lent, car tous lescallback
sont invoqués, même si elles ne fait rien (le modèle push) alors qu'avec StAX le curseur est déplacé uniquement sur les "interressant" éléments (modèle d'extraction).Par exemple avec java 7 :
XMLStreamReader
que lors de mes tests est plus rapide que votre SAX exemple: stackoverflow.com/a/12273296/383861Doughan, vous avez raison
OriginalL'auteur gontard
Un Stax Exemple
Sortie:
XMLStreamReader
est plus rapide queXMLEventReader
, voir: stackoverflow.com/a/12273296/383861OriginalL'auteur Mike