import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; import java.io.*; import java.net.*; import javax.xml.parsers.*; import org.w3c.dom.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; public class XMLJFrame extends JFrame implements ActionListener { //Çʵå public JTextField txtURL,txtTitle,txtKind,txtAuthor,txtPublisher,txtPrice; public JButton btnSearch, btnLoad; public JButton btnFirst, btnPrevious, btnNext, btnLast; public JButton btnModify, btnAdd, btnSave, btnClose; public Document xmlDoc; public Element ePrevious, eCurrent, eNext; public boolean isAddReady; //»ý¼ºÀÚ public XMLJFrame() { this.setTitle("XML ¹®¼­ ºä¾î"); //ºÏÂÊ ÆгΠ±¸¼ºÇϱâ JPanel pNorth = new JPanel(new BorderLayout()); pNorth.setBackground(Color.white); JLabel pNorthlblNorth = new JLabel("µµ¼­ ¸ñ·Ï ºä¾î ÇÁ·Î±×·¥"); pNorthlblNorth.setFont(new Font("µ¸¿ò",Font.PLAIN|Font.BOLD, 18)); pNorthlblNorth.setBorder(new EmptyBorder(20,20,20,20)); pNorthlblNorth.setHorizontalAlignment(JLabel.CENTER); JPanel pNorthpCenter = new JPanel(new BorderLayout()); pNorthpCenter.setBorder(new EmptyBorder(20,20,20,20)); JPanel pNorthpCenterpCenter = new JPanel(); TitledBorder tb1 = new TitledBorder("¹®¼­ °æ·Î ÀÔ·Â"); tb1.setTitleFont(new Font("µ¸¿ò",Font.PLAIN, 13)); pNorthpCenterpCenter.setBorder(tb1); txtURL = new JTextField(25); btnSearch = new JButton("ã¾Æº¸±â..."); btnLoad = new JButton("·Îµù"); pNorthpCenterpCenter.add(txtURL); pNorthpCenterpCenter.add(btnSearch); pNorthpCenterpCenter.add(btnLoad); pNorthpCenter.add("Center", pNorthpCenterpCenter); pNorth.add("North", pNorthlblNorth); pNorth.add("Center", pNorthpCenter); //Áß¾Ó ÆгΠ±¸¼ºÇϱâ JPanel pCenter = new JPanel(new BorderLayout()); pCenter.setBorder(new EmptyBorder(0,20,20,0)); JPanel pCenterpCenter = new JPanel(new BorderLayout()); TitledBorder tb2 = new TitledBorder("Ã¥ Á¤º¸"); tb2.setTitleFont(new Font("µ¸¿ò",Font.PLAIN, 13)); pCenterpCenter.setBorder(tb2); JPanel pCenterpCenterpWest = new JPanel(new GridLayout(5,1,10,10)); pCenterpCenterpWest.setBorder(new EmptyBorder(10,10,10,10)); JLabel lblTitle = new JLabel("Ã¥Á¦¸ñ"); JLabel lblKind = new JLabel("Á¾·ù"); JLabel lblAuthor = new JLabel("ÀúÀÚ"); JLabel lblPublisher = new JLabel("ÃâÆÇ»ç"); JLabel lblPrice = new JLabel("°¡°Ý"); pCenterpCenterpWest.add(lblTitle); pCenterpCenterpWest.add(lblKind); pCenterpCenterpWest.add(lblAuthor); pCenterpCenterpWest.add(lblPublisher); pCenterpCenterpWest.add(lblPrice); JPanel pCenterpCenterpCenter = new JPanel(new GridLayout(5,1,10,10)); pCenterpCenterpCenter.setBorder(new EmptyBorder(10,10,10,10)); txtTitle = new JTextField(20); txtKind = new JTextField(20); txtAuthor = new JTextField(20); txtPublisher = new JTextField(20); txtPrice = new JTextField(20); txtTitle.setEditable(false); txtKind.setEditable(false); txtAuthor.setEditable(false); txtPublisher.setEditable(false); txtPrice.setEditable(false); pCenterpCenterpCenter.add(txtTitle); pCenterpCenterpCenter.add(txtKind); pCenterpCenterpCenter.add(txtAuthor); pCenterpCenterpCenter.add(txtPublisher); pCenterpCenterpCenter.add(txtPrice); pCenterpCenter.add("West", pCenterpCenterpWest); pCenterpCenter.add("Center", pCenterpCenterpCenter); pCenter.add("Center", pCenterpCenter); //³²ÂÊ ÆгΠ±¸¼ºÇϱâ JPanel pSouth = new JPanel(new BorderLayout()); JPanel pSouthpCenter = new JPanel(new GridLayout(1,4)); pSouthpCenter.setBorder(new EmptyBorder(0,20,20,55)); btnFirst = new JButton("óÀ½"); btnPrevious = new JButton("ÀÌÀü"); btnNext = new JButton("´ÙÀ½"); btnLast = new JButton("¸¶Áö¸·"); pSouthpCenter.add(btnFirst); pSouthpCenter.add(btnPrevious); pSouthpCenter.add(btnNext); pSouthpCenter.add(btnLast); JPanel pSouthpEast = new JPanel(new GridLayout(1,1)); pSouthpEast.setBorder(new EmptyBorder(0,1,20,20)); btnClose = new JButton("´Ý±â"); pSouthpEast.add(btnClose); pSouth.add("Center", pSouthpCenter); pSouth.add("East", pSouthpEast); //µ¿ÂÊ ÆгΠ±¸¼ºÇϱâ JPanel pEast = new JPanel(new GridLayout()); pEast.setBorder(new EmptyBorder(0,20,20,20)); JPanel pEastpCenter = new JPanel(new GridLayout(3,1,0,20)); btnModify = new JButton("¼öÁ¤"); btnAdd = new JButton("Ãß°¡"); btnSave = new JButton("ÀúÀå"); pEastpCenter.add(btnModify); pEastpCenter.add(btnAdd); pEastpCenter.add(btnSave); pEast.add("Center", pEastpCenter); getContentPane().add("North", pNorth); getContentPane().add("Center", pCenter); getContentPane().add("South", pSouth); getContentPane().add("East",pEast); eventControl(); } //¸Þ¼­µå public void eventControl() { this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { System.exit(0); } }); btnSearch.addActionListener(this); btnLoad.addActionListener(this); btnFirst.addActionListener(this); btnPrevious.addActionListener(this); btnNext.addActionListener(this); btnLast.addActionListener(this); btnModify.addActionListener(this); btnAdd.addActionListener(this); btnSave.addActionListener(this); btnClose.addActionListener(this); } public void actionPerformed(ActionEvent ae) { Object obj = ae.getSource(); if(obj==btnSearch) btnSearch_Click(); if(obj==btnLoad) btnLoad_Click(); if(obj==btnFirst) btnFirst_Click(); if(obj==btnPrevious) btnPrevious_Click(); if(obj==btnNext) btnNext_Click(); if(obj==btnLast) btnLast_Click(); if(obj==btnModify) btnModify_Click(); if(obj==btnAdd) btnAdd_Click(); if(obj==btnSave) btnSave_Click(); if(obj==btnClose) btnClose_Click(); } public void btnSearch_Click() { // ·ÎÄà ÆÄÀÏÀ» ã±âÀ§ÇØ ¿­±â ´ÙÀ̾ó·Î±× ½ÇÇà JFileChooser fc = new JFileChooser(); int buttonKind = fc.showOpenDialog(this); if(buttonKind==JFileChooser.CANCEL_OPTION) { return; } // ¼±ÅÃÇÑ ÆÄÀÏÀ» ³ªÅ¸³»±â txtURL.setText(fc.getSelectedFile().getAbsolutePath()); } public void btnLoad_Click() { try { // Æļ­ °øÀå »ý¼º DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // WhiteSpace¸¦ ¹«½ÃÇÔ(XML¹®¼­¿¡ ¹®¼­À¯Çü¼±¾ðÀÌ ÀÖ¾î¾ß µ¿ÀÛÇÔ) factory.setIgnoringElementContentWhitespace(true); // Æļ­ »ý¼º DocumentBuilder parser = factory.newDocumentBuilder(); // ¿ø°Ý ÆÄÀÏÀÎÁö Á¶»ç if(txtURL.getText().indexOf("http://")!=-1) { // À¥¼­¹ö»óÀÇ XML ¹®¼­ ÆÄÀÏÀÏ °æ¿ì URL url = new URL(txtURL.getText()); InputStream is = url.openStream(); xmlDoc = parser.parse(is); } else if(!txtURL.getText().trim().equals("")) { // ·ÎÄà XML ¹®¼­ ÆÄÀÏÀÏ °æ¿ì xmlDoc = parser.parse(txtURL.getText()); } else { return; } // ·çÆ®¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶ ¾ò±â Element eRoot = xmlDoc.getDocumentElement(); // ù¹ø° book ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶ ¾ò±â Element eBook = (Element) eRoot.getFirstChild(); // ³×ºñ°ÔÀÌ¼Ç ÃʱâÈ­ ePrevious = null; eCurrent = null; eNext = null; txtTitle.setText(""); txtKind.setText(""); txtAuthor.setText(""); txtPublisher.setText(""); txtPrice.setText(""); // Ã¥Á¤º¸¸¦ µð½ºÇ÷¹ÀÌÇϱâ À§ÇØ displayBook ¸Þ¼Òµå È£Ãâ displayBook(eBook); } catch(Exception e) { JOptionPane.showMessageDialog(this, "°æ·Î¸¦ ãÀ» ¼ö°¡ ¾ø½À´Ï´Ù."); } } public void btnFirst_Click() { if(xmlDoc==null) return; // ·çÆ® ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶ ¾ò±â Element eRoot = xmlDoc.getDocumentElement(); // ù¹ø° book ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶ ¾ò±â Element eBook = (Element)eRoot.getFirstChild(); // Ã¥Á¤º¸¸¦ µð½ºÇ÷¹ÀÌÇϱâ À§ÇØ displayBook ¸Þ¼Òµå È£Ãâ displayBook(eBook); } public void btnPrevious_Click() { // Ã¥Á¤º¸¸¦ µð½ºÇ÷¹ÀÌÇϱâ À§ÇØ displayBook ¸Þ¼Òµå È£Ãâ displayBook(ePrevious); } public void btnNext_Click() { displayBook(eNext); } public void btnLast_Click() { if(xmlDoc==null) return; // ·çÆ® ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶ ¾ò±â Element eRoot = xmlDoc.getDocumentElement(); // ù¹ø° book ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶ ¾ò±â Element eBook = (Element)eRoot.getLastChild(); // Ã¥Á¤º¸¸¦ µð½ºÇ÷¹ÀÌÇϱâ À§ÇØ displayBook ¸Þ¼Òµå È£Ãâ displayBook(eBook); } public void btnModify_Click() { //¼öÁ¤ ¿©ºÎ if(eCurrent==null) { return; } else if(!txtTitle.isEditable()) { txtTitle.setEditable(true); txtKind.setEditable(true); txtAuthor.setEditable(true); txtPublisher.setEditable(true); txtPrice.setEditable(true); return; } txtTitle.setEditable(false); txtKind.setEditable(false); txtAuthor.setEditable(false); txtPublisher.setEditable(false); txtPrice.setEditable(false); // kind ¼Ó¼º°ª ¼öÁ¤ eCurrent.setAttribute("kind", txtKind.getText()); // title ¿¤¸®¸ÕÆ®ÀÇ ÄÁÅÙÆ® ³»¿ë ¼öÁ¤ Element eTitle = (Element)eCurrent.getFirstChild(); Text tTitle = (Text)eTitle.getFirstChild(); tTitle.setData(txtTitle.getText()); // author ¿¤¸®¸ÕÆ®ÀÇ ÄÁÅÙÆ® ³»¿ë ¼öÁ¤ Element eAuthor = (Element)eTitle.getNextSibling(); Text tAuthor = (Text)eAuthor.getFirstChild(); tAuthor.setData(txtAuthor.getText()); // publisher ¿¤¸®¸ÕÆ®ÀÇ ÄÁÅÙÆ® ³»¿ë ¼öÁ¤ Element ePublisher = (Element)eAuthor.getNextSibling(); Text tPublisher = (Text)ePublisher.getFirstChild(); tPublisher.setData(txtPublisher.getText()); // price ¿¤¸®¸ÕÆ®ÀÇ ÄÁÅÙÆ® ³»¿ë ¼öÁ¤ Element ePrice = (Element)ePublisher.getNextSibling(); Text tPrice = (Text)ePrice.getFirstChild(); tPrice.setData(txtPrice.getText()); } public void btnAdd_Click() { //Ãß°¡ °¡´É ¿©ºÎ if(xmlDoc==null) return; //óÀ½ Ŭ¸¯ÇßÀ» ¶§ ³»¿ëÀ» ºñ¿ì°í ¸Þ¼Òµå Á¾·á if(isAddReady==false) { txtTitle.setEditable(true); txtTitle.setText("Á¦¸ñ ÀÔ·Â"); txtKind.setEditable(true); txtKind.setText("Á¾·ù ÀÔ·Â"); txtAuthor.setEditable(true); txtAuthor.setText("ÀúÀÚ ÀÔ·Â"); txtPublisher.setEditable(true); txtPublisher.setText("ÃâÆÇ»ç ÀÔ·Â"); txtPrice.setEditable(true); txtPrice.setText("°¡°Ý ÀÔ·Â"); isAddReady = true; return; } //µÎ¹ø° Ŭ¸¯ÇßÀ» °æ¿ì ¾Æ·¡ Ãß°¡ ÄÚµå ½ÇÇà txtTitle.setEditable(false); txtKind.setEditable(false); txtAuthor.setEditable(false); txtPublisher.setEditable(false); txtPrice.setEditable(false); isAddReady = false; //title ¿¤¸®¸ÕÆ® °´Ã¼ »ý¼º Element eTitle = xmlDoc.createElement("title"); Text tTitle = xmlDoc.createTextNode(txtTitle.getText()); eTitle.appendChild(tTitle); //author ¿¤¸®¸ÕÆ® °´Ã¼ »ý¼º Element eAuthor = xmlDoc.createElement("author"); Text tAuthor = xmlDoc.createTextNode(txtAuthor.getText()); eAuthor.appendChild(tAuthor); //publisher ¿¤¸®¸ÕÆ® °´Ã¼ »ý¼º Element ePublisher = xmlDoc.createElement("publisher"); Text tPublisher = xmlDoc.createTextNode(txtPublisher.getText()); ePublisher.appendChild(tPublisher); //price ¿¤¸®¸ÕÆ® °´Ã¼ »ý¼º Element ePrice = xmlDoc.createElement("price"); Text tPrice = xmlDoc.createTextNode(txtPrice.getText()); ePrice.appendChild(tPrice); //book ¿¤¸®¸ÕÆ® °´Ã¼ »ý¼º Element eBook = xmlDoc.createElement("book"); //¼Ó¼º Ãß°¡ eBook.setAttribute("kind", txtKind.getText()); //book ¿¤¸®¸ÕÆ® °´Ã¼¿¡ ÀÚ½Ä ¿¤¸®¸ÕÆ® °´Ã¼ ºÙÀ̱â eBook.appendChild(eTitle); eBook.appendChild(eAuthor); eBook.appendChild(ePublisher); eBook.appendChild(ePrice); //·çÆ® ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶ ¾ò±â Element eRoot = xmlDoc.getDocumentElement(); //book ¿¤¸®¸ÕÆ® °´Ã¼¸¦ ·çÆ® ¿¤¸®¸ÕÆ® °´Ã¼¿¡ ºÙÀ̱â eRoot.appendChild(eBook); //Ãß°¡Çϱâ Àü¿¡ º¸¾Ò´ø Ã¥ ³»¿ëÀ» µð½ºÇ÷¹ÀÌ displayBook(eBook); } public void btnSave_Click() { try { // º¯È­±â °øÀå »ý¼º TransformerFactory factory = TransformerFactory.newInstance(); // º¯È¯±â »ý¼º Transformer transformer = factory.newTransformer(); // XML ¼±¾ð°ú ¹®¼­ À¯Çü ¼±¾ð ³»¿ë ¼³Á¤Çϱâ transformer.setOutputProperty(OutputKeys.ENCODING, "euc-kr"); transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "bml.dtd"); transformer.setOutputProperty(OutputKeys.INDENT, "no"); // ÀúÀå´ë»óÀÎ DOMSource °´Ã¼ »ý¼ºÇϱâ DOMSource source = new DOMSource(xmlDoc); // ÀúÀåÇÒ ÆÄÀÏ¿¡ ´ëÇÑ StreamResult °´Ã¼ »ý¼ºÇϱâ if(txtURL.getText().indexOf("http://")!=-1) { JFileChooser fc = new JFileChooser(); fc.showSaveDialog(this); txtURL.setText(fc.getSelectedFile().getAbsolutePath()); } else if(txtURL.getText().trim().equals("")) { return; } StreamResult result = new StreamResult(new File(txtURL.getText())); // DOM °´Ã¼¿¡¼­ XML ¹®¼­ ÆÄÀÏ·Î º¯È¯Çϱâ(ÀúÀåÇϱâ) transformer.transform(source, result); } catch(Exception e) { e.printStackTrace(); } } public void btnClose_Click() { System.exit(0); } public void displayBook(Element eBook) { if(eBook==null) { //book ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶°¡ ¾øÀ» °æ¿ì ¸Þ¼Òµå Á¾·á return; } else { //ÇöÀç book ¿¤¸®¸ÕÆ®ÀÇ ÀÌÀü ÇüÁ¦ book ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶¸¦ //ePrevious¿¡ ÀúÀå -- ÀÌÀü ¹öÆ° Äڵ忡¼­ »ç¿ë ePrevious = (Element)eBook.getPreviousSibling(); //ÇöÀç book ¿¤¸®¸ÕÆ®ÀÇ °´Ã¼ÂüÁ¶¸¦ eCurrent¿¡ ÀúÀå eCurrent = eBook; //ÇöÀç book ¿¤¸®¸ÕÆ®ÀÇ ´ÙÀ½ ÇüÁ¦ book ¿¤¸®¸ÕÆ® °´Ã¼ÂüÁ¶¸¦ //eNext¿¡ ÀúÀå -- ´ÙÀ½ ¹öÆ° Äڵ忡¼­ »ç¿ë eNext = (Element)eBook.getNextSibling(); } //kind ¼Ó¼º°ªÀ» ¾ò¾î³»¾î µð½ºÇ÷¹ÀÌ txtKind.setText(eCurrent.getAttribute("kind")); //title ¿¤¸®¸ÕÆ®ÀÇ ÄÁÅÙÆ® ³»¿ëÀ» ¾ò¾î³»¾î µð½ºÇ÷¹ÀÌ Element eTitle = (Element)eCurrent.getFirstChild(); Text tTitle = (Text)eTitle.getFirstChild(); txtTitle.setText(tTitle.getData()); //author ¿¤¸®¸ÕÆ®ÀÇ ÄÁÅÙÆ® ³»¿ëÀ» ¾ò¾î³»¾î µð½ºÇ÷¹ÀÌ Element eAuthor = (Element)eTitle.getNextSibling(); Text tAuthor = (Text)eAuthor.getFirstChild(); txtAuthor.setText(tAuthor.getData()); //publisher ¿¤¸®¸ÕÆ®ÀÇ ÄÁÅÙÆ® ³»¿ëÀ» ¾ò¾î³»¾î µð½ºÇ÷¹ÀÌ Element ePublisher = (Element)eAuthor.getNextSibling(); Text tPublisher = (Text)ePublisher.getFirstChild(); txtPublisher.setText(tPublisher.getData()); //price ¿¤¸®¸ÕÆ®ÀÇ ÄÁÅÙÆ® ³»¿ëÀ» ¾ò¾î³»¾î µð½ºÇ÷¹ÀÌ Element ePrice = (Element)ePublisher.getNextSibling(); Text tPrice = (Text)ePrice.getFirstChild(); txtPrice.setText(tPrice.getData()); } //¸ÞÀÎ ¸Þ¼­µå public static void main(String args[]) { // XMLJFrame °´Ã¼ »ý¼º XMLJFrame frame = new XMLJFrame(); // À©µµ¿ì ·è¾ØÇÊ·Î º¯°æ try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); SwingUtilities.updateComponentTreeUI(frame); } catch(Exception e) { } // Frame »çÀÌÁî ÁÖ±â frame.setSize(550,470); // Frame »çÀÌÁî °íÁ¤ frame.setResizable(true); // Frame º¸¿© ÁÖ±â frame.setVisible(true); } }