2010-10-03 4 views
2

J'essaie de diviser un gros fichier XML en fichiers plus petits en utilisant le SAXParser de java (en particulier le fichier wikipedia qui est d'environ 28 Go non compressé).Java: découpage d'un gros fichier XML avec SAXParser

J'ai une classe Pagehandler qui s'étend DefaultHandler:

private class PageHandler extends DefaultHandler { 

    private StringBuffer text; 
    ... 

    @Override 
    public void startElement(String uri, String localName, String qName, Attributes attributes) { 

     text.append("<" + qName + ">"); 
    } 

    @Override 
    public void endElement(String uri, String localName, String qName) { 

     text.append("</" + qName + ">"); 

     if (qName.equals("page")) { 
      text.append("\n"); 
      pageCount++; 
      writePage(); 
     } 

     if (pageCount >= maxPages) { 
      rollFile(); 
     } 
    } 

    @Override 
    public void characters(char[] chars, int start, int length) { 
     for (int i = start; i < start + length; i++) { 
      text.append(chars[i]); 
     } 
    } 
} 

Je peux donc écrire le contenu de l'élément sans problème. Mon problème est comment obtenir les balises et les attributs d'élément - ces caractères ne semblent pas être rapportés. Au mieux, je vais devoir les reconstruire à partir de ce qui est passé comme arguments à startElement - ce qui semble un peu difficile. Ou y a-t-il un moyen plus facile? Tout ce que je veux faire est de parcourir le fichier et de l'écrire, en roulant le fichier de sortie de temps en temps. À quel point cela peut-il être :)

Merci

+0

VTD-XML est idéal pour séparer des fichiers XML volumineux, l'édition étendue prend en charge le format xml jusqu'à 256 gb, elle prend également en charge mem-map et vous pouvez également utiliser xpath –

Répondre

1

Je suis comprends pas tout à fait sûr que je tout à fait ce que vous essayez de faire, mais pour obtenir le nom qualifié en tant que chaîne vous faites simplement qName.toString() et pour obtenir le nom des attributs vous venez de faire atts.getQName(int index).

+0

pour cela. Maintenant, mon problème est que les éléments contiennent des références de caractères xml qui sont décodées par l'analyseur - donc j'écris ">" par opposition à >. Une idée de comment contourner cela? –

+0

@Richard: si vous utilisez dom4j, comme je l'ai suggéré dans ma réponse, il va automatiquement encoder ces caractères spéciaux pour vous. C'est un autre avantage d'utiliser une bibliothèque au lieu d'écrire soi-même des documents XML. –

+0

@Richard - oui d'accord. merci pour cela et votre réponse à mon autre question. J'essaie de faire écho directement sans décoder puis recoder si possible. –

0

Le problème ici est que vous écrivez vous même les éléments XML. Jetez un oeil à la XMLWriter class de dom4j - alors qu'il est un peu vieux, il est très facile de sortir des documents XML en appelant ses méthodes startElement et endElement.

Questions connexes