Помощь по XML в JTable Пожалуйста, - PullRequest
1 голос
/ 20 сентября 2010

Я пытаюсь научиться импортировать из XML в JTable. Я анализирую следующий код в попытке понять, что происходит. Проблема в том, что я не могу понять, почему я не вижу никаких значений в JTable. Я уверен, что XML анализируется с помощью DOMBuilder и т. Д. Я включил код и файл XML, который я использую.
Спасибо заранее! Постскриптум Поместите файл person.xml в папку проекта.

import java.io.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class XMLInJTable extends AbstractTableModel {
        Vector data;
        Vector columns;

        public XMLInJTable() {
                try {
                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                        DocumentBuilder db = dbf.newDocumentBuilder();
                        Document doc = db.parse("person.xml");

                        NodeList nl = doc.getElementsByTagName("Name");
                        NodeList n2 = doc.getElementsByTagName("Address");
                        NodeList n3 = doc.getElementsByTagName("ContactNo");
                        NodeList listOfPersons = doc.getElementsByTagName("person");
                        String data1 = "", data2 = "", data3 = "";
                        data = new Vector();
                        columns = new Vector();
                        for (int i = 0; i < listOfPersons.getLength(); i++) {
                                data1 = nl.item(i).getFirstChild().getNodeValue();
                                data2 = n2.item(i).getFirstChild().getNodeValue();
                                data3 = n3.item(i).getFirstChild().getNodeValue();
                                String line = data1 + " " + data2 + " " + data3;
                                StringTokenizer st2 = new StringTokenizer(line, " ");
                                while (st2.hasMoreTokens())
                                        data.addElement(st2.nextToken());
                        }
                        columns.add("");
                        columns.add("");
                        columns.add("");

                } catch (Exception e) {
                        e.printStackTrace();
                }
        }

        public int getRowCount() {
                return data.size() / getColumnCount();
        }

        public int getColumnCount() {
                return columns.size();
        }

        public Object getValueAt(int rowIndex, int columnIndex) {
                return (String) data.elementAt((rowIndex * getColumnCount())
                                + columnIndex);
        }

        public static void main(String argv[]) throws Exception {
                XMLInJTable t = new XMLInJTable();
                JTable table = new JTable();
                table.setModel(t);
                JScrollPane scrollpane = new JScrollPane(table);
                JPanel panel = new JPanel();
                panel.add(scrollpane);
                JFrame frame = new JFrame();
                frame.add(panel, "Center");
                frame.pack();
                frame.setVisible(true);
        }
}

person.xml

<?xml version="1.0"  encoding="UTF-8"  standalone="no"?>

<Person>
<Name>Angelina</Name>
<Address>Dehi</Address>
<ContactNo>111111</ContactNo>

<Name>Martina</Name>
<Address>Mumbai</Address>
<ContactNo>222222</ContactNo>

</Person>

Редактировать * Мне удалось заставить его работать, потому что строка:

NodeList listOfPersons = doc.getElementsByTagName("person");

содержал маленькую букву p для «лиц», если бы она была заглавной P. Теперь мне удалось отобразить одну строку значений для Анджелины, но не для Мартины. Нужно понять это сейчас с помощью очень благодарной помощи, спасибо =)

1 Ответ

1 голос
/ 20 сентября 2010

Возможно, проблема с person.xml; это должно быть что-то вроде:

<?xml version="1.0"  encoding="UTF-8"  standalone="no"?>

<Persons>

<Person>
<Name>Angelina</Name>
<Address>Dehi</Address>
<ContactNo>111111</ContactNo>
</Person>

<Person>
<Name>Martina</Name>
<Address>Mumbai</Address>
<ContactNo>222222</ContactNo>
</Person>

</Persons>

В противном случае listOfPersons.getLength() всегда равно 1.

EDIT2: С другой стороны, я предлагаю вам пройти через узел, как следующий псевдокод:

for each <person> in <persons>
  for each child in <person>
    if child tag name is "Name"
      # do something 
    else if child tag name is "Address"
      # do something
    else if child tag name is "ContactNo"
      # do something

Таким образом, вы будете уверены, что получаете правильные данные для каждого человека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...