How to make xml schema (link) with JTable, xml java?

Here you can see my application: enter image description here

So what I need to do:

I don’t know how I can with the help of XML Schema link with JTable with all types (int, string, float). Let's say that Year is an int type, and in an int schema, and how can I bind it? I don’t know how to link or link in English. In this application, I write all the data in an xml file, and when the application loads, it loads all the data from the XML file.

Here I create an xml schema:

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(); } } 

Here are all types:

  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; } 

The xml file is written here:

 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"); } 

And here is the download of my xml file:

  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); } } 

But how to use xml shema with JTable, xml?

+1
source share
1 answer

"Here it is written in the xml file:" ---- "And here is the loading of my xml file:"

Why are you using the DOM to read and write xml when you are already using JAXB Mapping. If you correctly match 1, it's just a matter of using Marshaller and Unmarshaller to write and read, respectively. Be sure to look at these API links to see a usage example. Each operation requires only about 5 lines of code.

(1) For more information on JAXB mapping, see the JAXB tutorial . Sub>

Alternatively, you can simply create your own AbstractTableModel and untie and marshall directly to and from the table model. This is probably the most effective way to maintain synchronization. Create an Auto class to represent each row and the AutoModel class that will be the root element in the xml document, as well as the TableModel for JTable . Sort of:

Auto class

 @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 class

 @XmlRootElement(name = "AutoList") public class AutoModel extends AbstractTableModel { String[] columnNames = {"VIN", "Make", "Model", "Year"}; @XmlElement(name = "Auto") protected List<Auto> autos; public AutoModel() { autos = new ArrayList<Auto>(); } @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; } } 

Test using this xml file

 <?xml version="1.0" encoding="UTF-8"?> <AutoList> <Auto> <id>1</id> <VIN>123456788910FASDE</VIN> <Make>Mercedes</Make> <Model>CL 550</Model> <Year>2012</Year> <Description>Hello World</Description> <Cost>80000.00</Cost> </Auto> </AutoList> 

enter image description here

 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; } } 

While AutoModel is AutoModel , it only works for your first table. You will need to create another model for your repair table. In addition, the model is currently read-only. You will need to add other functions to add a row and set individual values.

Here are some resources to look at:


NOTE. . With the JAXB annotations above, you can create a schema, and you want to test it in xml, you can just set the schema when canceled. Sort of:

 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; } 
+3
source

All Articles