如何使xml架构与JTable,xml java相关联(链接)?

在这里你可以看到我的申请: 在此处输入图像描述

所以我需要做的是:

我不知道如何通过代码链接xml架构与JTable所有类型(int,string,float)。 比如说,Year是int类型,架构是int,我可以如何链接它? 我不知道将如何与英语链接或相关。 在此应用程序中,我将所有数据写入xml文件,并在加载应用程序时从xml文件加载所有数据。

在这里我创建xml架构:

public void CreateSchema(String FileName){ file=FileName; JAXBContext jc; try { jc = JAXBContext.newInstance(XmlSchemaType.class); jc.generateSchema(new SchemaOutputResolver() { @Override public javax.xml.transform.Result createOutput(String namespaceURI, String suggestedFileName)throws IOException { suggestedFileName=file+".xsd"; return new StreamResult(suggestedFileName); } }); } catch (IOException e) { e.printStackTrace(); } catch (JAXBException e) { e.printStackTrace(); } } 

这是所有类型:

  import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlAttribute; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "Auto") public class XmlSchemaType { row[] Row; } class row { @XmlAttribute byte ID; @XmlElement String VIN; @XmlElement String Make; @XmlElement String Model; @XmlElement int Year; @XmlElement String Description; @XmlElement float Cost; } 

这是写入xml文件:

 public void CreateXml(JTable tb,JTable tb2,String FileName){ try { file=FileName; DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); Document doc = docBuilder.newDocument(); Element rootElement = doc.createElement("Auto"); doc.appendChild(rootElement); int i=0,j=0,k=0; while (i<tb.getRowCount()){ j=0; Element rows = doc.createElement("Row"); rootElement.appendChild(rows); Attr attr = doc.createAttribute("id"); attr.setValue((i+1)+""); rows.setAttributeNode(attr); //Pirma lentele while (j<tb.getColumnCount()-1){ Element element = doc.createElement(tb.getTableHeader().getColumnModel().getColumn(j).getHeaderValue()+""); element.appendChild(doc.createTextNode(tb.getModel().getValueAt(i, j)+"")); rows.appendChild(element); j++; } //Antra lentele j=2;//pirmu lauku nereikia while (j<tb2.getColumnCount()-1){ Element element2 = doc.createElement(tb2.getTableHeader().getColumnModel().getColumn(j).getHeaderValue()+""); element2.appendChild(doc.createTextNode(tb2.getModel().getValueAt(i, j)+"")); rows.appendChild(element2); if (j==2){ tb2.getModel().setValueAt(tb.getModel().getValueAt(i, 0),i,1); } j++; } i++; } TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result; try { FileOutputStream fileOutputStream = null; fileOutputStream = new FileOutputStream( new File(file+".xml")); result = new StreamResult(fileOutputStream);//new FileOutputStream(file+".xml")); transformer.setOutputProperty(OutputKeys.INDENT, "yes");//new line... kad butu naujoje eiluteje transformer.transform(source, result); try { fileOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } } catch (ParserConfigurationException pce) { pce.printStackTrace(); } catch (TransformerException tfe) { tfe.printStackTrace(); } //file.renameTo(FileName+".xml"); } 

在这里加载我的xml文件:

  public void PopulateDataSet(JTable tb,JTable tb2,String FileName){ file=FileName; File f= new File(file+".xml"); if (f.exists()){ try { DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(f); doc.getDocumentElement().normalize(); NodeList nList = doc.getElementsByTagName("Row"); for (int temp = 0; temp < nList.getLength(); temp++) { Node nNode = nList.item(temp); if (nNode.getNodeType() == Node.ELEMENT_NODE) { Element eElement = (Element) nNode; DefaultTableModel model = (DefaultTableModel) tb.getModel(); model.addRow(new Object[] { "", "","","","Delete" }); tb.getModel().setValueAt(eElement.getElementsByTagName("VIN").item(0).getTextContent(),temp, 0); tb.getModel().setValueAt(eElement.getElementsByTagName("Make").item(0).getTextContent(),temp, 1); tb.getModel().setValueAt(eElement.getElementsByTagName("Make").item(0).getTextContent(),temp, 2); tb.getModel().setValueAt(eElement.getElementsByTagName("Year").item(0).getTextContent(),temp, 3); tb.getModel().setValueAt("Delete",temp, 4); DefaultTableModel model2 = (DefaultTableModel) tb2.getModel(); model2.addRow(new Object[] { (tb2.getRowCount()+1), "","","","Delete" }); tb2.getModel().setValueAt(eElement.getElementsByTagName("VIN").item(0).getTextContent(),temp, 1); tb2.getModel().setValueAt(eElement.getElementsByTagName("Description").item(0).getTextContent(),temp, 2); tb2.getModel().setValueAt(eElement.getElementsByTagName("Cost").item(0).getTextContent(),temp, 3); tb2.getModel().setValueAt("Delete",temp, 4); } } } catch (Exception e) { e.printStackTrace(); } } if (!f.exists()){ CreateXml(tb,tb2,file); CreateSchema(file); } } 

但是如何在JTable,xml中使用xml shema?

“这里写的是xml文件:” —- “这里加载我的xml文件:”

当您已经在使用JAXB Mapping时,为什么使用DOM来读取和写入xml。 如果你正确地进行了映射1 ,那么分别只需要使用MarshallerUnmarshaller来编写和读取。 请务必查看这些API链接,看看示例用法。 处理每个操作只需要大约5行代码。

(1)有关JAXB映射的更多信息,请参阅JAXB教程 。

此外,您可以直接创建自己的AbstractTableModel ,并在表模型中直接解组和编组。 这可能是保持一切同步的最有效方法。 创建一个Auto类来表示每一行,以及一个类AutoModel ,它将是xml文档中的根元素,以及JTableTableModel 。 就像是:

Auto

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Auto", propOrder = { "id", "VIN", "Make", "Model", "Year", "Description", "Cost" }) public class Auto { @XmlElement(name = "id") Integer id; @XmlElement(name = "VIN") String VIN; @XmlElement(name = "Make") String Make; @XmlElement(name = "Model") String Model; @XmlElement(name = "Year") Integer Year; @XmlElement(name = "Description") String Description; @XmlElement(name = "Cost") Float Cost; // === DON'T FORGET YOUR GETTERS and SETTERS } 

AutoModel

 @XmlRootElement(name = "AutoList") public class AutoModel extends AbstractTableModel { String[] columnNames = {"VIN", "Make", "Model", "Year"}; @XmlElement(name = "Auto") protected List autos; public AutoModel() { autos = new ArrayList(); } @Override public int getRowCount() { return autos.size(); } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int columnIndex) { return columnNames[columnIndex]; } @Override public boolean isCellEditable(int row, int col) { return false; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Auto auto = autos.get(rowIndex); Object value = null; switch (columnIndex) { case 0 : value = auto.getVIN(); break; case 1 : value = auto.getMake(); break; case 2 : value = auto.getModel(); break; case 3 : value = auto.getYear(); break; } return value; } } 

使用此xml文件进行Test

    1 123456788910FASDE Mercedes CL 550 2012 Hello World 80000.00   

在此处输入图像描述

 import java.awt.Dimension; import java.io.File; import javax.swing.*; import javax.xml.bind.*; public class TestTableMarshall { private static final String INPUT_FILE = "src/table/autos.xml"; private static final String OUTPUT_FILE = "src/table/autos1.xml"; public static void main(String[] args) throws Exception { AutoModel model = unmarshal(INPUT_FILE); JTable table = new JTable(model) { @Override public Dimension getPreferredScrollableViewportSize() { return getPreferredSize(); } }; JOptionPane.showMessageDialog(null, new JScrollPane(table)); marshal(model, OUTPUT_FILE); } private static void marshal(AutoModel model, String file) throws Exception { JAXBContext context = JAXBContext.newInstance(AutoModel.class); Marshaller marshaller = context.createMarshaller(); File f= new File(file); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(model, f); } private static AutoModel unmarshal(String file) throws Exception { JAXBContext context = JAXBContext.newInstance(AutoModel.class); Unmarshaller unmarshaller = context.createUnmarshaller(); AutoModel model = (AutoModel)unmarshaller.unmarshal(new File(file)); return model; } } 

AutoModel而言,它只适用于您的第一个表。 您需要为维修表创建另一个模型。 此外,该模型目前仅提供只读。 您需要添加其他function来添加行并设置单个值。

以下是一些资源:

  • 如何使用表:创建表模型
  • JAXB规范总结

注意:使用上面的JAXB注释,您可以创建模式,并且您想要针对它validationxml,您可以在解组时设置模式。 就像是:

 private static AutoModel unmarshal(String file) throws Exception { JAXBContext context = JAXBContext.newInstance(AutoModel.class); Unmarshaller unmarshaller = context.createUnmarshaller(); SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = factory.newSchema(new File("src/table/autos.xsd")); unmarshaller.setSchema(schema); AutoModel model = (AutoModel)unmarshaller.unmarshal(new File(file)); return model; }