1

saxパーサーからのデータを配列に保存する必要がありますが、nullreal値が表示され、最後に範囲外の配列の例外が表示されます。名前属性の vtype や値など、すべてのデータ型を配列に追加するにはどうすればよいですか。

import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;  
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JFrame;
import org.xml.sax.Attributes; 
import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class JTabbedPaneDemo extends JPanel {

     /*static String[] nameatt= {" sv_machineData "," Mould_data "," Core_1 "," Core_2 "};*/


    public JTabbedPaneDemo() {
    //  ImageIcon icon = new ImageIcon("java-swing-tutorial.JPG");

        JTabbedPane jtbExample = new JTabbedPane();

        // Create First Tab.
        JPanel jplInnerPanel1 = createInnerPanel();
        jtbExample.addTab(" Sv_Machine_Data ", jplInnerPanel1);
        jplInnerPanel1.setLayout(new BorderLayout());
        JTable table1 = new JTable(5,3);
        JScrollPane tableContainer = new JScrollPane(table1);
        jplInnerPanel1.add(tableContainer,BorderLayout.CENTER);

        //jtbExample.setSelectedIndex(0);

        // Create Second Tab.
        JPanel jplInnerPanel2 = createInnerPanel();
        jtbExample.addTab(" Mould_data ", jplInnerPanel2);
        jplInnerPanel2.setLayout(new BorderLayout());
        JTable table2 = new JTable(5,3);
        JScrollPane tableContainer1 = new JScrollPane(table2);
        jplInnerPanel2.add(tableContainer1,BorderLayout.CENTER);

        // Create Third Tab.
        JPanel jplInnerPanel3 = createInnerPanel();
        jtbExample.addTab(" Core_1 ", jplInnerPanel3);
        jplInnerPanel3.setLayout(new BorderLayout());
        JTable table3 = new JTable(5,3);
        JScrollPane tableContainer3 = new JScrollPane(table3);
        jplInnerPanel3.add(tableContainer3,BorderLayout.CENTER);

        // Create Fourth Tab.
        JPanel jplInnerPanel4 = createInnerPanel();
        jtbExample.addTab(" Core_2 ", jplInnerPanel4);
        jplInnerPanel4.setLayout(new BorderLayout());
        JTable table4 = new JTable(5,3);
        JScrollPane tableContainer4 = new JScrollPane(table4);
        jplInnerPanel4.add(tableContainer4,BorderLayout.CENTER);


        // Add the Tabbed Pane to this panel.
        setLayout(new GridLayout(1, 1));
        add(jtbExample);
    }


protected JPanel createInnerPanel() {
    JPanel jplPanel = new JPanel();
    JLabel jlbDisplay = new JLabel();
    jlbDisplay.setHorizontalAlignment(JLabel.CENTER);
    jplPanel.setLayout(new GridLayout(1, 1));
    jplPanel.add(jlbDisplay);
    return jplPanel;
}
public static void main(String[] args) {

    final String[] vt= {};
    JFrame frame = new JFrame("TabbedPane Source Demo");
    frame.addWindowListener(new WindowAdapter() {

        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

    /*final JTabbedPaneDemo xm = new JTabbedPaneDemo();*/

    try {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {

    boolean bfname = false;
    boolean blname = false;
    String nameAttribute;

    public void startElement(String uri, String localName,String qName, Attributes attributes)
    throws SAXException {

        if (qName.equalsIgnoreCase("TYP")) {
            bfname = true;
            }

        nameAttribute = attributes.getValue("Name");

        if (qName.equalsIgnoreCase("VALUE")){
            blname = true;
            }
    }

    public void characters(char ch[], int start, int length)
    throws SAXException {

        if (bfname) {
            System.out.println("Type : "+ new String(ch, start, length));
            String vtype = new String(ch, start, length);
            String [] typ = new String[length] ;
            for(int i=0;i<=length;i++) {
            typ[i]+=vtype;
            System.out.println("Type is "+typ[i]);
            }

            /*System.out.println("value of vt" +vt[j]);*/
            /*xm.textArea.append(vtype+"\n");*/
            bfname = false;
            }

        if (nameAttribute != null && !nameAttribute.equals("")) {
            //System.out.println("Name : " + nameAttribute);
            /*vname+=nameAttribute+ ", " +"\n";
            xm.textArea_3.setText(vname);
            */}

        if (blname) {   
            String vvalue = new String(ch, start, length);
            //System.out.println("Value:" + Double.valueOf(vvalue));
            /*xm.textArea_1.append(Double.valueOf(vvalue)+"\n");*/
            blname = false;
            }
    }
    };

    saxParser.parse(new File("my xmllocal address.xml"), handler);

    }
    catch (Exception e) {
    e.printStackTrace();
    }
    frame.getContentPane().add(new JTabbedPaneDemo(),BorderLayout.CENTER);
    frame.setSize(400, 500);
    frame.setVisible(true);
}

サンプル XML

<?xml version="1.0" encoding="UTF-8"?>
<HMI_Data Version="1.0" MaschinenNR.="XXXXXX" Date="21-10-2009">
   <VarGroup Name="VG_MachineData">
      <Variable Name="Mold1.sv_rMoldStroke">
         <Typ>REAL</Typ>
         <Value>6.000000e+02</Value>
      </Variable>
      <Variable Name="Core1.sv_rMaxSpeedFwd">
         <Typ>REAL</Typ>
         <Value>5.000000e+01</Value>
      </Variable>
      <Variable Name="Core1.sv_rMaxSpeedBwd">
         <Typ>REAL</Typ>
         <Value>5.000000e+01</Value>
      </Variable>
      <Variable Name="Core1.sv_rMaxPressureFwd">
         <Typ>REAL</Typ>
         <Value>1.450000e+02</Value>
      </Variable>
      <Variable Name="Core1.sv_rMaxPressureBwd">
         <Typ>REAL</Typ>
         <Value>1.450000e+02</Value>
4

1 に答える 1

2

これが問題です:

 for(int i=0;i<=length;i++) {
     typ[i]+=vtype;
     System.out.println("Type is "+typ[i]);
 }

連結前に null であるnullため、各値の先頭にいます。typ[i]

最後の反復で so の代わりに<=使用しているため、例外が発生しています。<ilengthtyp[i]

次の方法でループを修正できます。

 for (int i = 0;i < length; i++) {
     typ[i] = vtype;
     System.out.println("Type is " + typ[i]);
 }

...しかし、それはかなり無意味なようです。そもそも文字列配列を作成する理由はありません。

配列内のすべてのタイプが必要な場合は、その配列 (または理想的にはリスト) をメソッドの外側で作成する必要がありますメソッドは、テキストの各部分に対して呼び出されます。リストを進行中の状態として作成し、メソッド内でリストに追加する必要があります。characterscharacterscharacters

これが実際に巨大なファイルでない限り、私は個人的には SAX から離れて開始します。一度だけ読み込める巨大なファイルには非常に強力ですが、ファイル全体をある種の DOM 表現 (潜在的にJDOM などのサードパーティの XML ライブラリ)。

于 2013-05-16T05:42:06.963 に答える