2012-04-26 6 views
3

Привет всем У меня есть файл XML в Java, который держит 2d массив чисел он выглядит что-то вродеЧитайте XML файл Java

<tableNumbers> 
    <row id="0"> 
     <column id="0"> 4 </column> 
     <column id="1"> 2 </column> 
     <column id="2"> 5 </column> 
     <column id="3"> 6 </column> 
    </row> 
    <row id="1"> 
     <column id="0"> 5 </column> 
     <column id="1"> 10 </column> 
     <column id="2"> 7 </column> 
     <column id="3"> 9 </column> 
    </row> 
</tableNumbers> 

Теперь каждая строка в таблице имеет одинаковое количество colums и что я я пытаюсь выполнить цикл через xml и сохранить номер из файла XML в массив Integer. (Напр., Строка 0 столбец 0 будет храниться в цифрах [0] [0]

Код я в настоящее время является:

public static Integer[][] getNumbers(File file, int noRows, int noColums){ 
     Integer[][] numbersArray = new Integer[noRows][noColumns]; 

     DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
     try { 
      Document document = docBuilderFactory.newDocumentBuilder().parse(file); 
      Element rootElement = document.getDocumentElement(); 

      NodeList rowList = rootElement.getElementsByTagName("row"); 
      if ((rowList != null)) 
       for (int i = 0; i < rowList.getLength(); i++) { 
        NodeList columnsList = rowList.item(i).getChildNodes(); 
        if ((columnsList != null)) 
         for (int j = 0; j < columnsList.getLength(); j++) { 
          Element number = (Element) columnsList.item(j); 
          System.out.println("(" +i + "," + j + ") " + number.getNodeValue()); 
          numbersArray[i][j] = number.getNodeValue(); 
         } 
       } 

      return numbersArray; 
     } 
     catch (Exception c){} 
     return null; 
} 

Несколько строк из стандартного выхода являются:

(0,0) null 
(0,1) null 
(0,2) null 
(0,3) null 
(1,0) null 
(1,1) null 
(1,2) null 
(1,3) null 

значение, которое возвращается из всех клеток null. Я знаю, что ошибка чтения из файла XML. Если кто-то может показать мне, где я неправильно, я был бы весьма признателен

+1

Unrelated комментарий: Вы не нуждаетесь в '&& (rowList.getLength()> 0 ', а' && (columnsList.getLength()> 0) 'условия: если GetLength 0 петля выиграл» t12: – assylias

+0

Спасибо, что изменил это, чтобы это отразить. –

ответ

3

Я хотел бы добавить следующее:

Element number = (Element) columnsList.item(j); 
if ("column".equals(number.getTagName())) } 
    System.out.println("(" +i + "," + j + ") " + number.getTextContent()); 
} 

Поскольку вы можете иметь пустой элемент. Кроме того, я использую метод getTextContent() от Node.

0

Является ли этот пример XML точной копией? Если это так, то ваши замыкающие теги «row» имеют ошибку. Они должны быть </row> (т.е. они не имеют косой черты).

+0

Нет, я написал это неправильно. Спасибо, что указали, что хотя –

+0

Не беспокойтесь. Я просто понял, что вы не получили бы выход, если бы он не сделал, t узнайте теги открытия и закрытия. Вернуться к коду :) – David

0

Попробуйте System.out.println("(" +i + "," + j + ") " + number.item(0).getNodeValue()); вместо System.out.println("(" +i + "," + j + ") " + number.getNodeValue());

ИЛИ

NodeList valList = number.getChildNodes(); 
System.out.println("Last Name : " + ((Node) valList.item(0)).getNodeValue()); 

Надежда, которая работает,

0

getNodeValue возвращает значение узла - узлы колонки не имеют значения (кроме пробелов). Они должны содержать текстовые элементы, хотя, и они будут содержать значения, которые нужно

0

Я внесла некоторые изменения, чтобы заставить его работать. Вот фрагмент.

    for (int j = 0; j < columnsList.getLength(); j++) { 
         if ("column".equals(columnsList.item(j) 
           .getNodeName())) { 
          Element number = (Element) columnsList.item(j); 
          System.out.println("(" + i + "," + j + ") " 
            + columnsList.item(j).getTextContent()); 
          numbersArray[i][j] = Integer 
            .parseInt(columnsList.item(j) 
              .getTextContent().trim()); 
         } 
        } 
+0

Позвольте мне угадать, вы использовали мой пример и внесли изменения в код? правильно? –

Смежные вопросы