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

时间:2014-09-21 20:13:40

标签: java swing jaxb xsd jtable

在这里你可以看到我的申请: enter image description here

所以我需要做的事情:

我不知道如何通过代码链接xml架构与JTable的所有类型(int,string,float)。像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 个答案:

答案 0 :(得分:3)

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

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

(1)有关JAXB映射的详情,请参阅JAXB tutorial

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

JTable上课

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; } } ,使用此xml文件

Test

enter image description here

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

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; } } 为止,它只适用于您的第一张桌子。您需要为维修表创建另一个模型。此外,该模型目前仅提供只读。您需要添加其他功能来添加行并设置单个值。

以下是一些资源:


注意:使用上面的JAXB注释,您可以创建架构,并且您想要针对它验证xml,您可以在解组时设置架构。类似的东西:

AutoModel