2013-09-06 2 views
2

Я беру XML-файл в качестве ввода (данные в файле похожи на индексную страницу книги, с названиями разделов и некоторой другой информацией), и я использую свой код для извлечения из него нескольких значений. Три значения, которые я получаю из файла являются:Почему некоторые записи заменяются?

Title (a long string of title to the chapter) 
Number (chapter number) 
ID (This is an ID associated with chapter, format: xxx-yy-zzz) 

Что мне нужно сделать, это сохранить эти значения в 5 различных столбцов в листе Excel (разделив ID вокруг переносы, где каждая часть идентификатора разные суб-идентификаторы).

Итак, я итерацию по файлу, получите название, номер и ID, и объединить их вместе с «-» между таким образом, что она выглядит как строка формата

Титульный Номер-SubID1 -SubID2-SubID3

и я добавляю каждую из этих строк в список, который я потом перебираю, разделяю с «-» и получаю каждое из 5 значений и записываю на лист Excel.

В моем файле 113 уникальных вхождений, но я просто замечаю, что в моем листе Excel я получаю только 103 уникальных вхождения и 10 значений являются дубликатами. И как-то, 10 значений, которые должны быть там, отсутствуют в листе. Я действительно смущен тем, что происходит.

EDIT:

Это где я получаю строку для каждого идентификатора шлю в вместе с документом XML.

public static String getBooksFromDoc(Document doc, String id) 
     throws Exception { 
    String idset = null; 
    String title = null; 
    String num = null; 
    doc.getDocumentElement().normalize(); 
    XPath xPath = XPathFactory.newInstance().newXPath(); 
    XPathExpression xPathExpr = (XPathExpression) xPath 
      .compile("//document[@id ='" + id + "']"); 
    NodeList nlist = (NodeList) xPathExpr.evaluate(doc, 
      XPathConstants.NODESET); 
    for (int i = 0; i < nlist.getLength(); i++) { 
     rulebookProp = new RulebookProperties(); 
     Node nnode = nlist.item(i); 
     XPathExpression xPath1 = (XPathExpression) xPath 
       .compile(".//idset"); 
     Element eelement = (Element) nnode; 
     Node idNode = (Node) xPath1.evaluate(eelement, XPathConstants.NODE); 
     idset = idNode.getFirstChild().getNodeValue(); 

     XPathExpression xPath2 = (XPathExpression) xPath 
       .compile(".//title"); 
     Element eelement1 = (Element) nnode; 
     Node idNode1 = (Node) xPath2.evaluate(eelement1, 
       XPathConstants.NODE); 
     if (idNode1 == null) { 
      title = " "; 
     } else { 
      title = idNode1.getFirstChild().getNodeValue(); 
     } 

     XPathExpression xPath3 = (XPathExpression) xPath 
       .compile(".//number"); 
     Element eelement2 = (Element) nnode; 
     Node idNode2 = (Node) xPath3.evaluate(eelement2, 
       XPathConstants.NODE); 
     if (idNode2 == null) { 
      num = " "; 
     } else { 
      num = idNode2.getFirstChild().getNodeValue(); 
     } 
    } 
    return title + "-" + num + "-" + idset; 
} 

Я добавляю каждую из строк, возвращенных в список.

List<String> books = new ArrayList<String>(); 

books.add(getBooksFromDoc(xmlDoc, id); 

Это метод, в котором я использую список для получения 5 значений. (Примечание: В некоторых вхождений ID выглядит ххх или ххх-ууу или ххх-ууу-ZZZ, т.е. это может быть сделано из трех частей или один (что объясняет условия в моем коде).)

public static List<BookObject> getBookEntries(
     List<String> books) { 
    String bookTitle = " "; 
    String bookID = " "; 
    String bookElementID = " "; 
    String recordID = " "; 
    String bookNo = " "; 


    for String book : books) { 

     String[] parts = book.split("-"); 
     if (parts.length == 5) { 
      for (int i = 0; i < parts.length; i++) { 
       bookTitle = parts[0] 
       bookNo = parts[1] 
       bookID = parts[2]; 
       bookElementID = parts[3]; 
       recordID = parts[4]; 
       bookObj = new BookObject(); 
       bookObj.setBookTitle(bookTitle); 
       bookObj.setBookNo(bookNo); 
       bookObj.setBookId(bookID); 
       bookObj.setBookElementId(bookElementID); 
       bookObj.setRecordId(recordID); 
      } 
     } else if (parts.length == 4) { 
      for (int i = 0; i < parts.length; i++) { 
       bookTitle = parts[0] 
       bookNo = parts[1] 
       bookID = parts[2]; 
       bookElementID = parts[3]; 
       bookObj = new BookObject(); 
       bookObj.setBookTitle(bookTitle); 
       bookObj.setBookNo(bookNo); 
       bookObj.setBookId(bookID); 
       bookObj.setBookElementId(bookElementID); 
       bookObj.setRecordId(recordID); 
      } 
     } else if (ids.length == 1) { 
      for (int i = 0; i < parts.length; i++) { 
       bookTitle = parts[0] 
       bookNo = parts[1] 
       bookID = parts[2]; 
       bookObj = new BookObject(); 
       bookObj.setBookTitle(bookTitle); 
       bookObj.setBookNo(bookNo); 
       bookObj.setBookId(bookID); 
       bookObj.setBookElementId(bookElementID); 
       bookObj.setRecordId(recordID); 
      }  
     } 
     bookEntries.add(bookObj); 
    } 
    return bookEntries; 
} 

Позже я просто перебираю все bookEntries и добавляю к листу Excel. (Я надеюсь, что это немного упростило.)

for (int i = 0; i < listEntries.size(); i++) { 
      Row dataRow = sheet.createRow(i+1); 
      dataRow.createCell(0).setCellValue(
        bookEntries.get(i).getBookTitle()); 
      dataRow.createCell(1).setCellValue(
        bookEntries.get(i).getBookId()); 
      dataRow.createCell(2).setCellValue(
        bookEntries.get(i).getBookElementId()); 
      dataRow.createCell(3).setCellValue(
        bookEntries.get(i).getRecordId()); 
      dataRow.createCell(4).setCellValue(
        bookEntries.get(i).getBookNo()); 
} 
+0

Нам нужно посмотреть, как вы читаете xml и пишите в excel. Покажите нам только релевантные детали. –

+0

+1 @SotiriosDelimanolis - как мы можем знать, что вы делаете неправильно, если мы не можем видеть, как вы это делаете? –

+0

@SotiriosDelimanolis, пожалуйста, проверьте изменения. – DT7

ответ

2

Я нашел ответ. Причиной для этих отсутствующих записей был формат данных из XML. Некоторые записи (10) имели дефис в названии. Я ошибочно не считал это, так как в большинстве записей не было дефис в их имени. Таким образом, это привело к разделению этих строк на 6 частей, которые мой код не обрабатывал. Я предположил, что его можно разделить на 5 частей. Я исправил это сейчас, и он отлично работает :)

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