2014-09-21 61 views
1

在這裏你可以看到我的應用程序: enter image description here如何使xml架構與JTable相關(鏈接),xml java?

所以我需要做的:

我不知道我可以通過代碼鏈接的XML模式與JTable中所有類型(整型,字符串,浮點)。比如說Year是int類型,Schema是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); 
     } 


    } 

但如何使用xml shema與JTable,xml?

+1

你想從XML模式中獲得什麼?基於XML的驗證?具有編組/解組支持的JAXB風格的類映射?還有別的嗎? – kjhughes 2014-09-21 21:28:25

回答

3

「在這裏被寫入到XML文件:」 ---- 「在這裏,我的加載XML文件:」

你爲什麼要使用DOM讀寫的XML,當你已經使用JAXB映射。如果您正在正確執行映射,則分別使用MarshallerUnmarshaller分別進行寫入和讀取操作。確保看看這些API鏈接喲看到示例用法。只有5行代碼才能處理每個操作。

(1)有關JAXB映射的更多信息,請參閱JAXB tutorial

此外,你可以創建自己的AbstractTableModel和unmarshal和marshal直接和從表模型。這可能是保持所有內容同步的最有效方法。創建一個類Auto以表示每一行,以及一個類AutoModel,這將成爲xml文檔中的根元素,以及的TableModel。喜歡的東西:

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<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,使用此XML文件

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

就在該AutoModel推移,它僅適用於你的第一個表。您需要爲修理表創建另一個模型。此外,該模型目前只提供只讀。您需要添加其他功能來添加行並設置單個值。

這裏有一些資源來看待:


注:隨着JAXB註釋上面可以創建模式,和你你想要根據它來驗證xml,你可以在解組時設置模式。例如:

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

不確定,但+1努力 – mKorbel 2014-09-22 06:08:07