使用jaxb将java对象转换为xml,反之亦然(marshal和unmarshal)

我想有一个名为save()的方法,它应该将右侧面板中的计算机部件列表编组为XML文件。 反过来,另一个名为load()方法应该将保存的XML文件解组回一个对象。

基本上,“Save”事件将调用save()方法并将右侧面板中的部件列表保存到XML文件中。 “Load”事件应清除右侧面板,并调用load()方法。

调用load() ,它应在右侧面板中显示未编组的数据。 我得到“退出”工作。

我很难搞清楚“加载”和“保存”部分。

 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class PCParts implements ActionListener{ JList destinationList, sourceList; JButton buttonin, buttonout; DefaultListModel source, destination; public JPanel createContentPane (){ JPanel totalGUI = new JPanel(); source = new DefaultListModel(); destination = new DefaultListModel(); String shoppingItems[] = {"Case", "Motherboard", "CPU", "RAM", "GPU", "HDD", "PSU"}; for(int i = 0; i >"); buttonin.setHorizontalAlignment(SwingConstants.RIGHT); buttonin.addActionListener(this); buttonPanel.add(buttonin); JPanel bottomPanel = new JPanel(); bottomPanel.setLayout(new BoxLayout(bottomPanel, BoxLayout.LINE_AXIS)); bottomPanel.add(Box.createRigidArea(new Dimension(10,0))); bottomPanel.add(list1); bottomPanel.add(Box.createRigidArea(new Dimension(5,0))); bottomPanel.add(buttonPanel); buttonout = new JButton("<<"); buttonout.addActionListener(this); buttonPanel.add(buttonout); bottomPanel.add(Box.createRigidArea(new Dimension(5,0))); bottomPanel.add(list2); bottomPanel.add(Box.createRigidArea(new Dimension(10,0))); totalGUI.add(bottomPanel); totalGUI.setOpaque(true); return totalGUI; } private JPanel createSquareJPanel(Color color, int size) { JPanel tempPanel = new JPanel(); tempPanel.setBackground(color); tempPanel.setMinimumSize(new Dimension(size, size)); tempPanel.setMaximumSize(new Dimension(size, size)); tempPanel.setPreferredSize(new Dimension(size, size)); return tempPanel; } public void actionPerformed(ActionEvent e) { int i = 0; if(e.getSource() == buttonin) { int[] fromindex = destinationList.getSelectedIndices(); Object[] from = destinationList.getSelectedValues(); for(i = 0; i =0; i--) { source.remove(fromindex[i]); } } else if(e.getSource() == buttonout) { Object[] to = sourceList.getSelectedValues(); int[] toindex = sourceList.getSelectedIndices(); for(i = 0; i =0; i--) { destination.remove(toindex[i]); } } } private static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true); JFrame frame = new JFrame("PC Parts Builder"); JMenu file = new JMenu ("File"); file.setMnemonic (KeyEvent.VK_F); PCParts demo = new PCParts(); frame.setContentPane(demo.createContentPane()); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); JMenuBar menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); JMenu mnFile = new JMenu("File"); menuBar.add(mnFile); JMenuItem item; file.add(item = new JMenuItem("Load")); item.setMnemonic (KeyEvent.VK_O); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doOpenCommand(); } private void doOpenCommand() { // TODO Auto-generated method stub } }); mnFile.add(item); JMenuItem mntmSave = new JMenuItem("Save"); mntmSave.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doSaveCommand(); } private void doSaveCommand() { } }); mnFile.add(mntmSave); JMenuItem mntmNewMenuItem = new JMenuItem("Exit"); mntmNewMenuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.exit(0); } }); mnFile.add(mntmNewMenuItem); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } } 

只需创建一个类来保存List 。 然后你可以编组/解组该类的实例。

 @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class Parts { @XmlElement(name = "part") private List part; public List getPart() { return part; } public void setPart(List part) { this.part = part; } } 

至于编组(保存),您可以通过使用Parts类创建JAXBContext来创建Marshaller 。 关于编组人员的刚召唤marshal

查看一些重载的marshal方法 (注意File

 private void doSaveCommand() throws Exception { ArrayList save = new ArrayList<>(); for (int i = 0; i < destination.size(); i++) { save.add((String)destination.getElementAt(i)); } Parts parts = new Parts(); parts.setPart(save); JAXBContext context = JAXBContext.newInstance(Parts.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(parts, System.out); } 

请注意,您有一些设计问题。 需要访问的DefaultListModels不能是因为侦听器代码在static上下文中,并且模型不是static 。 我只是将模型设置为static以使其工作,但您需要重新设计一下代码。 这是结果(到标准输出 - 你将编组到文件)。

   Case Motherboard CPU  

我会让你自己解决这个问题。 这应该让你开始。

一些资源

  • Marshaller API doc有一些例子
  • Unmarshaller API doc有一些例子
  • JAXContext API doc对上下文有一些解释
  • 一般JAXB教程