XML lesen, ändern und speichern

Status
Nicht offen für weitere Antworten.
J

Jango Azzameen

Gast
Hallo,

ich habe folgendes Problem:
Ich lese über den SWT TreeViewer in einem Plugin eine XML Datei aus und lasse diese als TreeViewer in einem View Anzeigen. Auf einem anderen View werden die Werte der letzten Tags als Gui angezeigt.
Jetzt soll es möglich sein die Werte in der GUI zu verändern und diese auch in der XML-Datei an der passenden stelle schreiben. Desweiteren möchte ich bei dem TreeView mit der rechten Maus auf einen Tag klicken und über ein Kontext Menü einen neuen Tag hinzufügen, einen Tag löschen oder umbenennen.

Ich habe schon überall etwas gesucht aber nichts passenden gefunden.


MFG Jango
 
V

Vayu

Gast
wo ist dein problem? Also was dabei kannst du nicht? Hast du schon einen Ansatz?

Ansonsten, wie liest du die XML datei aus, wie verarbeitest du sie?
 
J

Jango Azzameen

Gast
Hallo,

ich hatte die Variante mit dem rechtclick über das widget Menu auf den treeviewer versucht doch treeviewer besitzt nicht die Methode setMenu()

Das auslesen funktioniert soweit, nur für das speichern finde ich keinen wirklichen ansatz ohne das die XML-Datei vollkommen neue geschrieben wird.

Hier ist der Code:

XMLView zum erstellen des Views aus der XML-Datei
Code:
   public class XMLView extends ViewPart {

   public TreeViewer treeviewer;
   public static String file = "D:/test.xml";
      
   public XMLView() {	   
 
   }
     
  
   public void createPartControl(Composite parent) {
	   
	   	 treeviewer = new TreeViewer(parent, SWT.SINGLE);
	   	 treeviewer.setContentProvider(new XMLTreeContentProvider());
	   	 treeviewer.setLabelProvider(new XMLListLabelProvider());
	   	 treeviewer.setInput(ReadXMLFile.readXML(file));
	   	 
	   	 getSite().setSelectionProvider(treeviewer); 
   }   
  
   public void setFocus() {
      }
   }

mfg Jango
 
J

Jango Azzameen

Gast
Aus irgendendeinem Grund kann ich die QUelltexte nur einzeln posten daher sry.

ReadXMLFile zum auslesen der XML
Code:
import java.io.File;

import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.*;


public class ReadXMLFile {
	
	private static Node documentNode = null;
	private static Document doc;
	
    public static Object readXML(String xmlFilePath) {
        try {
            documentNode = DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder().parse(new File(xmlFilePath));
            doc = (Document) documentNode;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return documentNode;
    }
    
    public static String[] getElement(String TagNam, String SelTagName){
    	
    	String[] NodeValue = new String[2];
    	  
        try {    	  
        	  doc.getDocumentElement().normalize();
        	  
        	  NodeList list = doc.getElementsByTagName(SelTagName);

        	  for (int i = 0; i < list.getLength(); i++) {
        	      Node node1 = list.item(i);
    	    	  String prnt = ((Element) node1).getElementsByTagName(TagNam).item(0).getParentNode().getNodeName();
        	      if (node1.getNodeType() == Node.ELEMENT_NODE && prnt.equals(SelTagName)) {
        	          	    	  
        	    	  Element element = (Element) node1;
        	    	  NodeList firstNodeElementList = element.getElementsByTagName(TagNam);
        	    	  Element element1 = (Element) firstNodeElementList.item(0);
        	    	  NodeList firstNodeList = element1.getChildNodes();
        	    	  
        	    	  Node value = firstNodeElementList.item(0).getChildNodes().item(0);
        	    	  
        	    	  if(value != null){
            	    	  NodeValue[0] = ((Node) firstNodeList.item(0)).getNodeValue();    	    		      	    		  
        	    	  }
        	    	  else{
            	    	  NodeValue[0] = " ";
        	    	  }
        	    	  
        	    	  NodeValue[1] = prnt;
        	      }
        	      else{
        	    	  NodeValue[0] = " ";
        	    	  NodeValue[1] = " ";
        	      }
        	  }
        	      
          } catch (Exception e) {}
          
          return NodeValue;
    }
}
 
J

Jango Azzameen

Gast
Code:
public class ListenerView extends ViewPart implements ISelectionListener
{
public void createPartControl(Composite parent) {
	
	 tk = new FormToolkit(parent.getDisplay());
	
	 GridLayout layout = new GridLayout();

  	 layout.numColumns = 2;
  	 layout.marginHeight = 20; //abstand vom oberern Rand
  	 layout.marginWidth = 20;  //abstand vom linken Rand
  	 
  	 parent.setLayout(layout);
  	 
 	 Composite cmp = tk.createComposite(parent);
  	 cmp.setLayout(new GridLayout(2, false));
  	 GridData gdCmp = new GridData(SWT.FILL, SWT.FILL, false, false);
  	 gdCmp.horizontalSpan = 2;
  	 cmp.setLayoutData(gdCmp);
  	 
  	 createGUI(cmp);

  	 btsave = (Button) createCTR("Speichern", normal, false, 3, parent, null);

  	 getViewSite().getPage().addSelectionListener(this);
}

public void selectionChanged(IWorkbenchPart part, ISelection selection) {
	SelTag = selection.toString();
	SelTagName = SelTag.substring(SelTag.indexOf("[[")+2, SelTag.lastIndexOf(": null]]"));
	
	for(int i=0; i<req.length; i++){
		selectChoice(chl[i], ReadXMLFile.getElement(req[i], SelTagName)[0]);
	}

	txl[0].setText(ReadXMLFile.getElement("ReqOIBCC", SelTagName)[1]);
	for(int i=0; i<othxml.length; i++){
		setLblTx(txl[i+1], ReadXMLFile.getElement(othxml[i], SelTagName)[0]);
	}
}

public void setLblTx(Text tx, String str){
	tx.setText(str);	
}

public void selectChoice(Combo ch, String str){
    for(int i=0; i<ch.getItemCount(); i++){
    	if(ch.getItems()[i].equals(str)){
    		ch.select(i);
    	}
    }	
}

}
 
V

Vayu

Gast
also was das Menu für den TreeViewer angeht, das machst du so

Code:
private void createContextMenu() {
        // Create menu manager.
        MenuManager menuMgr = new MenuManager();
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager mgr) {
                fillContextMenu(mgr);
            }
        });

        // Create menu.
        Menu menu = menuMgr.createContextMenu(m_viewer.getControl());
        m_viewer.getControl().setMenu(menu);

        // Register menu for extension.
        getSite().registerContextMenu(menuMgr, m_viewer);
    }

    private void fillContextMenu(IMenuManager mgr) {
        // Hier füge deine actions in den mgr
        mgr.add(new Action(){...});
        mgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
    }

die createContextMenu rufst du in deiner init methode auf.

Was das einfügen/abändern von values und knoten in der xml datei angeht, da bietet dir doch die org.w3c.dom.Node schon alle notwendigen Methoden.
 
J

Jango Azzameen

Gast
Danke!
wie sage ich der action, das er an dieser Stelle einen neuen Knoten hinzufügen soll. Hab es mit treeviewer.add(); und appendchild versucht doch das funktionier nicht

Code:
mgr.add(new Action("test"){
    	   		public void run(){
    	   			Object obj = treeviewer.getSelection();
    	   			Node nodeparent = (Node) obj;
    	   			Node newChild = null;
    	   			newChild.setNodeValue("test");
    	   			nodeparent.appendChild(newChild);
    	   		}
    	   }

oder muss ich das in dem ContentProvider und LabelProvider machen und wenn ja wie?

mfg Jango[/code]
 
V

Vayu

Gast
naja du hast doch irgendein model im hintergrund, in deinem Fall wahrscheinlich n Document oder ne NodeList? Dein ContentProvider arbeitet ja wahrscheinlich auf diesem Model.

Also füge an gewünschter Stelle in deinem Document einen neuen node ein und refreshe den treeviewer
 
J

Jango Azzameen

Gast
Das ändert aber nur das Model was dahinter steht es soll ja die ganze XML Datei geändert werden und nicht nur das was zu sehen ist.

MFG Jango
 
V

Vayu

Gast
naja dann bau dir halt ne save methode, die dein Document wieder zurückspeichert
 
J

Jango Azzameen

Gast
Und eben das ist das Problem ich habe keinen Ansatz wie ich diese Save Methode realisieren soll.

mfg Jango
 
V

Vayu

Gast
edit:

so

Code:
// use specific Xerces class to write DOM-data to a file:
    XMLSerializer serializer = new XMLSerializer();
    serializer.setOutputCharStream(
      new java.io.FileWriter("order.xml"));
    serializer.serialize(document);

oder so

Code:
Document d = db.parse(document);

TransformerFactory tf = TransformerFactory.newInstance();
Transformer t = tf.newTransformer();
t.transform(new DOMSource(d), <output>);
 
V

Vayu

Gast
der DocumentBuilder ... den hast du ja schon in deiner readMethode

aber probier mal das erste CodeSample aus. habs noch reineditiert
 
J

Jango Azzameen

Gast
der kennt XMLSerializer nicht kannst du mir nen link geben wo ich die entsprechende Klasse finde

mfg Jango
 
V

Vayu

Gast
das ist ne Klasse vom Xerces

org.apache.xml.serialize

wenn du keine extra lib willst, dann nimm die TransformerFactory
 
J

Jango Azzameen

Gast
das hilft mir irgendwie nicht weiter, ds Output muss vom Typ Result sein dort kann ich jedoch keinen Pfad angeben
 
J

Jango Azzameen

Gast
Danke das hat geholfen!

Ich habe jedoch noch das Problem einen neuen Knoten über ein Kontextmenü hinzuzufügen.
So sieht meine aktuelle Funktion aus, sie befindet sich in der XMLView:

Code:
   private void createContextMenu() {
       // Create menu manager.
       MenuManager menuMgr = new MenuManager();
       menuMgr.setRemoveAllWhenShown(true);
       menuMgr.addMenuListener(new IMenuListener() {
           public void menuAboutToShow(IMenuManager mgr) {
               fillContextMenu(mgr);
           }
       });

       // Create menu.
       Menu menu = menuMgr.createContextMenu(treeviewer.getControl());
       treeviewer.getControl().setMenu(menu);

       // Register menu for extension.
       getSite().registerContextMenu(menuMgr, treeviewer);
   }

       mgr.add(new Action("Hinzufügen"){
    	   		public void run(){
    	   			//TODO: Einfügen eines neuen Knoten an selectierter Stelle
    	   			treeviewer.refresh();
    	   		}
    	   }
       );
       
       mgr.add(new Action("Löschen"){
	   		public void run(){
	   			//TODO: Löschen eines Knoten an selectierter Stelle
	   			treeviewer.refresh();
	   			}
	   		}
       );
       
       mgr.add(new Action("Umbenennen"){
	   		public void run(){
	   			//TODO: Umbennen des Knoten an selectierter Stelle
	   			treeviewer.refresh();
	   			}
	   		}
      );
       mgr.add(new GroupMarker(IWorkbenchActionConstants.MB_ADDITIONS));
   }

MFG Jango
 
V

Vayu

Gast
ehm ich möchte mich ja jetzt nicht zitieren, aber ich hab doch schon vorhin schon geschrieben, dass die Klasse Node, die du aus deinem Document rausholen kannst schon die notwendigen Methoden liefert, die neue knoten in dein Document einfügen können ...
 
J

Jango Azzameen

Gast
Hallo,
hab ich schon versucht und die funktion removeChild(Node oldChild) ausprobiert und anschließend refresh aufgerufen aber es hat nichts gebracht.

Als Test hatte ich das verwendet:

Code:
           mgr.add(new Action("Löschen"){
    	   public void run(){
    		   treeviewer.remove(treeviewer.getSelection());
    		   treeviewer.refresh();
    	   		}
       		}
       );
 
V

Vayu

Gast
o_O ... weil du sie nicht aus dem model sondern nur aus dem tree gelöscht hast ... hast du das nicht gemacht, was wir dir oben erklärt haben?
 
J

Jango Azzameen

Gast
Ok, hinzufügen und löschen funktioniert doch das umbennen nicht da es keine Methode setNodeName gibt oder muss ich das anders realisieren?

mfg Jango
 
V

Vayu

Gast
naja ich würd mal davon ausgehen, dass du statt rename ein add & remove machen musst
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
frager2345 Bild aus Dateien lesen und als Hintergrund verwenden AWT, Swing, JavaFX & SWT 2
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
G JavaFX Wert aus DB lesen, wenn erfolgreich automatisch eine fxml laden, möglich? AWT, Swing, JavaFX & SWT 2
B JavaFX Werte aus eingefügtem Window lesen AWT, Swing, JavaFX & SWT 0
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
X buttons aus externe klasse lesen? AWT, Swing, JavaFX & SWT 3
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
N Custom JButton Feld aus Parent lesen lassen AWT, Swing, JavaFX & SWT 11
N Swing FileReader Zeile lesen AWT, Swing, JavaFX & SWT 5
E Daten aus sortierter Tabelle lesen AWT, Swing, JavaFX & SWT 2
E Swing File lesen und in JEditorpane AWT, Swing, JavaFX & SWT 2
B SWT Textdatei Lesen und Anzeige in View - Zeichensatzproblem AWT, Swing, JavaFX & SWT 4
G in JTextField wie in der Console Ein String ein lesen AWT, Swing, JavaFX & SWT 8
C Werte aus der Tabelle lesen AWT, Swing, JavaFX & SWT 4
S Daten aus editierbaren TableModel lesen AWT, Swing, JavaFX & SWT 7
G Text eines noch aktiv editierten Textfeldes lesen AWT, Swing, JavaFX & SWT 2
J Icons ueber getRessource lesen AWT, Swing, JavaFX & SWT 5
M IOException beim Image lesen AWT, Swing, JavaFX & SWT 4
S TextBox aus einen ActionListener herraus lesen AWT, Swing, JavaFX & SWT 4
M Dialog erstellen und Eingaben lesen? AWT, Swing, JavaFX & SWT 20
M Unicode aus Datei lesen und darstellen? AWT, Swing, JavaFX & SWT 11
R Bild grösse lesen. AWT, Swing, JavaFX & SWT 2
thE_29 Vor dem ersten Posten bitte lesen! AWT, Swing, JavaFX & SWT 0
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
H JDialog in Größe ändern - Resize-Cursor bleibt betreten der Komponente AWT, Swing, JavaFX & SWT 1
H AWT Dialog Größe ändern - Schwarzer Inhalt beim groß ziehen AWT, Swing, JavaFX & SWT 1
_user_q ChoiceBox Elemente: Sprache ändern AWT, Swing, JavaFX & SWT 7
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
B Deckraft ändern AWT, Swing, JavaFX & SWT 1
Davee JavaFX ListView = null wenn ich sie in Laufzeit ändern will! AWT, Swing, JavaFX & SWT 16
missy72 JavaFX RowFactory Schriftfarbe ändern AWT, Swing, JavaFX & SWT 6
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
Hatsi09 GUI Input Farbe ändern AWT, Swing, JavaFX & SWT 0
W JavaFX CSS ändern wirft NPE AWT, Swing, JavaFX & SWT 8
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
L Swing JLabel wird beim ändern der Schriftart immer neu gezeichnet. AWT, Swing, JavaFX & SWT 2
R Swing JTextField - Schriftgröße je nach Länge und Größe ändern AWT, Swing, JavaFX & SWT 0
OSchriever Layout über Radiobuttons ändern AWT, Swing, JavaFX & SWT 4
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
S JavaFX ListView Inhalte während Laufzeit ändern AWT, Swing, JavaFX & SWT 23
Shallty JavaFX MenuItem (Info) Icon ändern AWT, Swing, JavaFX & SWT 7
J Schriftart über einen Button ändern AWT, Swing, JavaFX & SWT 1
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
C Bilder so einbinden, dass sie sich ändern AWT, Swing, JavaFX & SWT 6
S JavaFX Boolean ändern Table View AWT, Swing, JavaFX & SWT 14
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
I Java Bildfarbe ändern wie bei Photoshop AWT, Swing, JavaFX & SWT 9
cool_brivk24 Swing Button Farbe ändern AWT, Swing, JavaFX & SWT 2
B Observer Pattern JLabel ändern AWT, Swing, JavaFX & SWT 7
K JavaFX TextInputDialog Button Text ändern AWT, Swing, JavaFX & SWT 1
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
das_leon AWT Button Design ändern AWT, Swing, JavaFX & SWT 5
S JavaFX GridPane Zellen Seitenverhätnis passend ändern mit der Stage AWT, Swing, JavaFX & SWT 0
S Parameter ändern in try/catch AWT, Swing, JavaFX & SWT 5
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
G JavaFX TableView Wert in Spalte ändern AWT, Swing, JavaFX & SWT 0
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
L JavaFX button über andere Klasse ändern AWT, Swing, JavaFX & SWT 7
T JavaFX Text des ProgressIndicators ändern AWT, Swing, JavaFX & SWT 2
T JavaFx Examples ändern liefert unerwartetes Ergebnis AWT, Swing, JavaFX & SWT 5
Z Swing JTree DefaultMultipleTreeNode Repräsentation ändern AWT, Swing, JavaFX & SWT 1
MaxG. Swing Farbe von Button beim drücken ändern AWT, Swing, JavaFX & SWT 4
MaxG. JFrame Größe ändern AWT, Swing, JavaFX & SWT 16
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
K Sprache ändern AWT, Swing, JavaFX & SWT 11
P Jframe Bild einfügen, Hintergrund Farbe ändern, und Button schrift Größe ändern AWT, Swing, JavaFX & SWT 2
S JavaFX fxml datein mit menübar ändern AWT, Swing, JavaFX & SWT 20
W Kodierung (CharSet) beim Schreiben ändern AWT, Swing, JavaFX & SWT 1
Neumi5694 LookAndFeel Look & Feel nicht angezeigter Komponenten ändern AWT, Swing, JavaFX & SWT 6
T AWT Farben in einem Bild ändern AWT, Swing, JavaFX & SWT 8
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
krgewb Swing JTree - Farbe von nodes ändern AWT, Swing, JavaFX & SWT 4
D Swing JScrollPane Tabelle ändern (2 Tabellen) AWT, Swing, JavaFX & SWT 7
Sugan Inhalte mit Threads ändern -> java.lang.IllegalStateException AWT, Swing, JavaFX & SWT 6
X JMenu Menu-Bar ausrichtung ändern im Programm AWT, Swing, JavaFX & SWT 0
D JavaFX Probleme bei Service-Klasse beim ändern der GUI AWT, Swing, JavaFX & SWT 8
P im JTable die Schriftfarbe ändern AWT, Swing, JavaFX & SWT 19
F GUI Auflösung ändern - Koordianten und Proportions Problem AWT, Swing, JavaFX & SWT 21
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
R LookAndFeel Wie kann man die Textfarbe der Nimbus ProgressBar nach Füllstand ändern? AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
J JTable bounds ändern durch resizing des Fensters AWT, Swing, JavaFX & SWT 9
F JTable Zellen-Hintergrund ändern AWT, Swing, JavaFX & SWT 7
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
S JavaFX NullPointerException bei Versuch ImageView zu ändern AWT, Swing, JavaFX & SWT 1
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
E JLabel aus Runnable ändern AWT, Swing, JavaFX & SWT 2
Tom299 JavaFX TreeView Expanded-Icon ändern AWT, Swing, JavaFX & SWT 0
M JavaFX Progressbar bar und track Komponente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 2
B 3D-Grafik Java 3D Licht während Laufzeit ändern AWT, Swing, JavaFX & SWT 0
T JavaFX "DefaultButton"-Design ändern AWT, Swing, JavaFX & SWT 8
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben