Textdatei komplett auslesen

Status
Nicht offen für weitere Antworten.

Titanpharao

Bekanntes Mitglied
Guten Tag,

wie ist es möglich eine Textdatei komplett auszulesen, oder nur zu einem Teil? Ist dies überhaupt sinnvoll wenn wir mal annehmen das die Textdatei 100MB oder größer ist dies als "RiesenString" im Hauptspeicher zu lassen.

Mein Problem besteht darin, ich habe eine XML Datei. Diese kann nach belieben aufgebaut werden, also z.b. das endtag muss nicht auf der selben Zeile stehen.

<tag> text text
</tag>

usw gibt viele derartige Beispiele. Nur ich habe zwar die "tag-namen" doch ich muss jetzt alles was zwischen diesen sich befindet herrausnehmen und in eine neue Datei speichern.

Jemand eine Idee...?

p.s.:Mir fält gerade eine man könnte immer eine zeile weiter springen bis das /tag> zeichen folgt. Nur was ist wenn man

<tag>
<tag2></tag2>
<tag3></tag3>
</tag>

hat und nur tag und tag2 haben will ....
 
Hm....

Ich habe einen Tree, wo all Tags aufgeführt sind.
Diese kann man anklicken und dann auf einen Button klicken.
Dann wird eine neue Datei erstellt, welche nur die angeklickten Tags in die Datei reinschreibt.
Wie soll das mit einem Parser gehen? Der weis doch nicht welche angeklicht wurden.

Abgesehen davon habe ich das in verschiedenen Modulen 🙁
 
Titanpharao hat gesagt.:
Dann wird eine neue Datei erstellt, welche nur die angeklickten Tags in die Datei reinschreibt.
Wie soll das mit einem Parser gehen? Der weis doch nicht welche angeklicht wurden.
Na, wenn du beim Klicken die Datei selbst einlesen kannst, dann kannst du das an der Stelle auch mit einem XML-Parser machen.

Wie bist du denn zur Liste der Tags gekommen? Mit einem XML-Parser, oder durch Suchen in der Textdatei?
 
Poste mal denn Code...aber bitte jetzt nicht alles durcheinanderbringen :bahnhof:
Ich bin so froh, das der Baum mit denn Tags und klicken funktioniert.

Code:
package xml;

import java.io.File;
import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class VSXwV {
	public XMLTreeHandler handler;
	public TreeModel parse(String filename) {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    handler = new XMLTreeHandler();
    try {
      // Parse the input.
      SAXParser saxParser = factory.newSAXParser();
      saxParser.parse(new File(filename), handler);
    } catch (Exception e) {
      System.err.println("File Read Error: " + e);
      e.printStackTrace();
      return new DefaultTreeModel(new DefaultMutableTreeNode("error"));
    }
    return new DefaultTreeModel(handler.getRoot());
  }

  public static class XMLTreeHandler extends DefaultHandler {
	
	public ArrayList<XSD> xsdschema = new ArrayList<XSD>();
	int nr=0;
	  
    private DefaultMutableTreeNode root, currentNode;
    public DefaultMutableTreeNode getRoot() {
      return root;
    }

    // SAX Parser Handler methods...

    public void startElement(String namespaceURI, String lName,
          String qName, Attributes attrs) throws SAXException {
          String eName = lName; // Element name
          if ("".equals(eName))
            eName = qName;
          Tag t = new Tag(eName);
          DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(t);

          boolean set=true;
          
          if(currentNode==null){
          xsdschema.add(new XSD(newNode,nr,0));
          }
          else{
        	  int anz=xsdschema.size();
        	  for(int x=0;x<anz;++x){
        		  if(newNode.equals(xsdschema.get(x).dmtn))set=false;
        	  }
        	  if(set)
              for(int i=0;i<anz;++i){
            	  if(currentNode.equals(xsdschema.get(i).dmtn)){
            		  for(int j=i;j<anz;++j){
            			  if(newNode.toString().equals(xsdschema.get(j).dmtn.toString())&&xsdschema.get(j).vaterele==i){
            				set=false;	  
            			  }
            		  } 
   					  if(set){
   						  nr++;
   						  xsdschema.add(new XSD(newNode,nr,i));
   					  }
            		  break;
            	  }
              }       
          }
          /*if(set){
          System.out.print(xsdschema.get(nr).dmtn+"\t");
          System.out.print(xsdschema.get(nr).elenr+"\t");
          System.out.println(xsdschema.get(nr).vaterele);
          }*/ 
          if (currentNode == null) {
            root = newNode;
          } else {
        	  currentNode.add(newNode);
          }
          currentNode = newNode;
     }

    public void endElement(String namespaceURI, String sName, String qName)
        throws SAXException {
      currentNode = (DefaultMutableTreeNode) currentNode.getParent();
    }
    
    public void characters(char buf[], int offset, int len)
        throws SAXException {
      String s = new String(buf, offset, len).trim();
      //System.out.println(s); Enthaltende Werte 
      ((Tag) currentNode.getUserObject()).addData(s);
    }
}

  public static class Tag {
    private String name;

    private String data;

    public Tag(String n) {
      name = n;
    }

    public String getName() {
      return name;
    }

    public void setData(String d) {
      data = d;
    }

    public String getData() {
      return data;
    }

    public void addData(String d) {
      if (data == null) {
        setData(d);
      } else {
        data += d;
      }
    }

    public String toString() {
      return name;
    }
  }
}

Das der Code zum Parsen und in eine bestimme Form zu bringen, die ich beim Tree benötige. und der sieht zum teil so aus...

Code:
		CheckNode[] nodes = new CheckNode[anz];
	    for (int i=0;i<anz;i++) {
	      nodes[i] = new CheckNode(xsdschema.get(i).dmtn);
	    }
	    for(int i=1;i<anz;++i){
	    	nodes[xsdschema.get(i).vaterele].add(nodes[xsdschema.get(i).elenr]);
	    }
	    nodes[0].setSelected(true);
	    JTree tree = new JTree( nodes[0] );
	    tree.setCellRenderer(new CheckRenderer());//Erzeugt die Checkboxen
	    tree.putClientProperty("JTree.lineStyle", "Angled");
	    tree.addMouseListener(new NodeSelectionListener(tree));

package gui;

import java.util.*;
import javax.swing.tree.*;


public class CheckNode extends DefaultMutableTreeNode {

  public final static int SINGLE_SELECTION = 0;
  public final static int DIG_IN_SELECTION = 4;
  protected int selectionMode;
  protected boolean isSelected;

  public CheckNode() {
    this(null);
  }

  public CheckNode(Object userObject) {
    this(userObject, true, false);
  }

  public CheckNode(Object userObject, boolean allowsChildren
                                    , boolean isSelected) {
    super(userObject, allowsChildren);
    this.isSelected = isSelected;
    setSelectionMode(DIG_IN_SELECTION);
  }


  public void setSelectionMode(int mode) {
    selectionMode = mode;
  }

  public int getSelectionMode() {
    return selectionMode;
  }

  public void setSelected(boolean isSelected) {
    this.isSelected = isSelected;
    
    if ((selectionMode == DIG_IN_SELECTION)
        && (children != null)) {
      Enumeration enumX = children.elements();      
      while (enumX.hasMoreElements()) {
        CheckNode node = (CheckNode)enumX.nextElement();
        node.setSelected(isSelected);
      }
    }
  }
  
  public boolean isSelected() {
    return isSelected;
  }
}

Ist noch viel länger auf jeden Fall kann ich die Nodes ansprechen und herrausfinden, welche Select sind und welche nicht. Würde da auch gern weiterhin ansetzen. Vielleicht jetzt nochmal alles Parsen und sich nur auf die Tags beziehen, wo select auf True steht?
 
Würdest du die Datei mit einem baumbasierten Ansatz (DOM oder JDOM) parsen, dann hättest du ja den gesamten Baum im Speicher und könntest zu jedem Tree-Node die entsprechende Referenz im XML-Dom halten. Leider sind die Dateien ja wohl ziemlich groß, was eigentlich einen ereignisgetriebenen Parser erfordert (hast du ja auch benutzt). Vielleicht ist StAX eine Alternative für dich; damit hat man Zugriff auf Knoten im DOM, ohne dazu das gesamte DOM im Speicher halten zu müssen.

Falls du bei SAX bleiben willst, musst du die Datei wohl erneut parsen und beim startElement prüfen, ob es sich um ein angeklicktes Element handelt und in dem Fall alle weiteren Element in die Datei schreiben, bis das Element wieder beendet wurde.
 
Ich würde auch gern denn JDOM benutzen, habe nur das andere eher gefunden.

Code:
      CheckNode[] nodes = new CheckNode[anz];
       for (int i=0;i<anz;i++) {
         nodes[i] = new CheckNode(xsdschema.get(i).dmtn);
       }
       for(int i=1;i<anz;++i){
          nodes[xsdschema.get(i).vaterele].add(nodes[xsdschema.get(i).elenr]);
       }
       nodes[0].setSelected(true);
       JTree tree = new JTree( nodes[0] );

Diese Zeilen erstellen ja denn Baum. Ist es möglich die Werte aus dem JDOM Baum zu bekommen?

Bzw wie kann ich die "tabs" aus der Document herrausbekommen?

*noch bissel am rumspielen*
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben