Edycja rekordu w XML z poziomu Javy

0

Witam
Zna ktos sposób jak można łatwo edytować rekordy w XML z poziomu jezyka java? wiem ze sa jakies parsery ale czy nie ma czegos łatwiejszego. Prosze o podpowiedz.

0

A co masz przeciwko tym jakimś parserom? Może się zapoznaj z czym co się je, to nie będą tak straszne. Jak chcesz mieć wrażenie, że piszesz tylko w Java, to zobacz coś na temat JAXB. Tam akurat pewnie parser działa, ale właściwie to tylko plik wczytujesz. A jak już całkiem ci nic z XML związanego nie odpowiada, to jeszcze możesz użyć wyrażeń regularnych i tym sposobem coś spróbować zrobić w XML. Pytanie tylko, czy parser nie jest jednak prostszy.

0

Nie mam nic przeciwko parserom bo sie nie znam na tym. moze byc parser jesli jest łatwiejszy. czy mozesz podac jakis prosty przykład(jakis punkt zaczepienia) jak sie robi ta edycje, bede wdzieczny

0
aglasek napisał(a)

czy mozesz podac jakis prosty przykład(jakis punkt zaczepienia) jak sie robi ta edycje, bede wdzieczny

Mogę. Jak napiszesz co konkretnie chcesz zrobić, to ci doradzę czego najlepiej użyć. Od razu zapytam: czy masz schemat XSD do tego XML, który chcesz edytować, albo czy znasz strukturę dokumentu, żeby taki schemat sobie napisać? To co ci doradzę zależy od tego co chcesz w ten sposób uzyskać.

0

Mogę. Jak napiszesz co konkretnie chcesz zrobić, to ci doradzę czego najlepiej użyć. Od razu zapytam: czy masz schemat XSD do tego XML, który chcesz edytować, albo czy znasz strukturę dokumentu, żeby taki schemat sobie napisać? To co ci doradzę zależy od tego co chcesz w ten sposób uzyskać.
Nie mam schematu XSD.
Moze zaczne od poczatku...
chodzi mi o to: mam okno a w nim tabelke (kod ponizej) i przyciski "dodaj towar", "edytuj towar", i "usun towar" i teraz chce aby po uruchomieniu tego programu w tabelce pojawiły mi sie rekordy z pliku XML czyli "Nr towaru", "Nazwa towaru" itd. i po wczytaniu tego pliku XML chce np kliknac na jakis rekord w tabelce i zmienic np "Nazwe towaru" na inna i kiedy klikne edytuj to rekord w pliku XML zostanie zmieniony.
to tyle po krótce...

package GUI;

import java.awt.Toolkit;

public class Towary extends javax.swing.JFrame {

   
    public Towary() {
        initComponents();

        int width = Toolkit.getDefaultToolkit().getScreenSize().width;
        int height = Toolkit.getDefaultToolkit().getScreenSize().height;

        int widthFrame = this.getSize().width;
        int heightFrame = this.getSize().height;

        this.setLocation((width - widthFrame)/2, (height - heightFrame)/2);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jButtonUsun = new javax.swing.JButton();
        jButton4 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jSeparator1 = new javax.swing.JSeparator();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Zarzadanie towarami");
        setResizable(false);

        jButton1.setText("Edytuj");
        jButton1.setName("jButton1"); // NOI18N

        jButton2.setText("Anuluj");
        jButton2.setName("jButton2"); // NOI18N
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null},
                {null, null, null, null, null}
            },
            new String [] {
                "Nr towaru", "Nazwa towaru", "Ilosc towaru", "Cena netto", "Cena brutto"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Integer.class, java.lang.String.class, java.lang.Integer.class, java.lang.Double.class, java.lang.Double.class
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }
        });
        jTable1.setName("jTable1"); // NOI18N
        jScrollPane1.setViewportView(jTable1);

        jButtonUsun.setText("Usuń");
        jButtonUsun.setName("jButtonUsun"); // NOI18N
        jButtonUsun.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonUsunActionPerformed(evt);
            }
        });

        jButton4.setText("Dodaj");
        jButton4.setName("jButton4"); // NOI18N

        jLabel1.setFont(new java.awt.Font("Tahoma", 0, 14));
        jLabel1.setText("Towary:");
        jLabel1.setName("jLabel1"); // NOI18N

        jSeparator1.setName("jSeparator1"); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(119, 119, 119)
                .addComponent(jButton4)
                .addGap(50, 50, 50)
                .addComponent(jButtonUsun)
                .addGap(57, 57, 57)
                .addComponent(jButton1)
                .addGap(56, 56, 56)
                .addComponent(jButton2)
                .addContainerGap(133, Short.MAX_VALUE))
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jSeparator1, javax.swing.GroupLayout.DEFAULT_SIZE, 639, Short.MAX_VALUE)
                .addContainerGap())
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(52, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 558, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addGap(49, 49, 49))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 28, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton2)
                    .addComponent(jButton1)
                    .addComponent(jButtonUsun)
                    .addComponent(jButton4))
                .addGap(51, 51, 51))
        );

        pack();
    }// </editor-fold>                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        this.dispose();
    }                                        

    private void jButtonUsunActionPerformed(java.awt.event.ActionEvent evt) {                                            
        //javax.swing.table.DefaultTableModel.
                
    }                                           

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Towary().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButtonUsun;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JTable jTable1;
    // End of variables declaration                   

}
0

Akurat do tego, co chcesz zrobić idealne wydaje się być użycie bazy danych, a nie XML. Ale jak chcesz XML...
Właściwie wszystko masz i wszystko wiesz, tylko nie ma XML. Możesz użyć klas XMLDecoder i XMLEncoder do zapisu i odczytu obiektu DefaultTableMode. Co prawda nie testowałem jak to się zachowa na kolekcjach, ale w dokumentacji klasy piszą, żeby użyć. No i wtedy na otwarciu ładujesz model z pliku, przy zapisie zrzucasz i masz wszystko co potrzebujesz bez wgłębiania się w XML. Przykłady są w dokumentacji obu klas, nic nie trzeba dodawać.

0

Chodzi mi o możliwość kombinowania na rekordach: dodawanie, usuwanie i edycja na danych zapisanych w pliku XML. Przykładowo:

 <?xml version="1.0" encoding="UTF-8"?>
<root>
	<user>
		<login>test</login>
		<pass>123</pass>
	</user>
 </root>

Dla takiego pliku xml chciałbym dodawać, edytować i usuwać użytkownika za pomocą javy. Pytanie moje jest takie czy jest jakiś gotowy schemat który potrafiłby sobie z tym poradzić (jeśli tak to jaki ) na przykład przy użyciu parsera ?

0

Hej stwórz sobie klase User, zawierającą własciwośći, jakie chcesz mieć w xmlu.
Klasa ta musi implementować interfejs serializable.

Nastepnie przy zapisie do pliku użyj XMLEncoder, np.:

import java.beans.XMLEncoder;
import java.beans.XMLDecoder;
import java.io.*;

public class FooHelper {
    public static void write(Foo f, String filename) throws Exception{
        XMLEncoder encoder =
           new XMLEncoder(
              new BufferedOutputStream(
                new FileOutputStream(filename)));
        encoder.writeObject(f);
        encoder.close();
    }

    public static Foo read(String filename) throws Exception {
        XMLDecoder decoder =
            new XMLDecoder(new BufferedInputStream(
                new FileInputStream(filename)));
        Foo o = (Foo)decoder.readObject();
        decoder.close();
        return o;
    }
}

Dzięki temu obiekty klasy User bea zapiosywane do pliku xml.

Pozdrawiam.

0

hehe wielkie dzieki. to działa

1 użytkowników online, w tym zalogowanych: 0, gości: 1