From 2e283f2ebfdb7386e81ee59053bd47695ff31df5 Mon Sep 17 00:00:00 2001 From: Dominik Stadler Date: Tue, 21 Oct 2014 15:56:45 +0000 Subject: [PATCH] Apply patch for bug 55864 - XSSFImportFromXML.importFromXML() does not support optional elements git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1633404 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/extractor/XSSFImportFromXML.java | 18 +- .../xssf/extractor/TestXSSFImportFromXML.java | 247 ++++++++++-------- test-data/spreadsheet/55864.xlsx | Bin 0 -> 10630 bytes 3 files changed, 157 insertions(+), 108 deletions(-) create mode 100644 test-data/spreadsheet/55864.xlsx diff --git a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFImportFromXML.java b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFImportFromXML.java index 534ef0d83..1cde38b30 100644 --- a/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFImportFromXML.java +++ b/src/ooxml/java/org/apache/poi/xssf/extractor/XSSFImportFromXML.java @@ -97,12 +97,15 @@ public class XSSFImportFromXML { String xpathString = singleXmlCell.getXpath(); Node result = (Node) xpath.evaluate(xpathString, doc, XPathConstants.NODE); - String textContent = result.getTextContent(); - logger.log(POILogger.DEBUG, "Extracting with xpath " + xpathString + " : value is '" + textContent + "'"); - XSSFCell cell = singleXmlCell.getReferencedCell(); - logger.log(POILogger.DEBUG, "Setting '" + textContent + "' to cell " + cell.getColumnIndex() + "-" + cell.getRowIndex() + " in sheet " - + cell.getSheet().getSheetName()); - cell.setCellValue(textContent); + // result can be null if value is optional (xsd:minOccurs=0), see bugzilla 55864 + if (result != null) { + String textContent = result.getTextContent(); + logger.log(POILogger.DEBUG, "Extracting with xpath " + xpathString + " : value is '" + textContent + "'"); + XSSFCell cell = singleXmlCell.getReferencedCell(); + logger.log(POILogger.DEBUG, "Setting '" + textContent + "' to cell " + cell.getColumnIndex() + "-" + cell.getRowIndex() + " in sheet " + + cell.getSheet().getSheetName()); + cell.setCellValue(textContent); + } } for (XSSFTable table : tables) { @@ -160,6 +163,7 @@ public class XSSFImportFromXML { _docElem = doc.getDocumentElement(); } + @Override public String getNamespaceURI(String prefix) { return getNamespaceForPrefix(prefix); } @@ -214,11 +218,13 @@ public class XSSFImportFromXML { } // Dummy implementation - not used! + @Override public Iterator getPrefixes(String val) { return null; } // Dummy implementation - not used! + @Override public String getPrefix(String uri) { return null; } diff --git a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFImportFromXML.java b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFImportFromXML.java index 5f39f37ce..16f1ab471 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFImportFromXML.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFImportFromXML.java @@ -37,119 +37,162 @@ public class TestXSSFImportFromXML extends TestCase { public void testImportFromXML() throws Exception{ XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("CustomXMLMappings.xlsx"); - - String name = "name"; - String teacher = "teacher"; - String tutor = "tutor"; - String cdl = "cdl"; - String duration = "duration"; - String topic = "topic"; - String project = "project"; - String credits = "credits"; - - String testXML = ""+ - ""+name+""+ - ""+teacher+""+ - ""+tutor+""+ - ""+cdl+""+ - ""+duration+""+ - ""+topic+""+ - ""+project+""+ - ""+credits+""+ - "\u0000"; - - XSSFMap map = wb.getMapInfo().getXSSFMapByName("CORSO_mapping"); - assertNotNull(map); - XSSFImportFromXML importer = new XSSFImportFromXML(map); - - importer.importFromXML(testXML); - - XSSFSheet sheet=wb.getSheetAt(0); - - XSSFRow row = sheet.getRow(0); - assertTrue(row.getCell(0).getStringCellValue().equals(name)); - assertTrue(row.getCell(1).getStringCellValue().equals(teacher)); - assertTrue(row.getCell(2).getStringCellValue().equals(tutor)); - assertTrue(row.getCell(3).getStringCellValue().equals(cdl)); - assertTrue(row.getCell(4).getStringCellValue().equals(duration)); - assertTrue(row.getCell(5).getStringCellValue().equals(topic)); - assertTrue(row.getCell(6).getStringCellValue().equals(project)); - assertTrue(row.getCell(7).getStringCellValue().equals(credits)); + try { + String name = "name"; + String teacher = "teacher"; + String tutor = "tutor"; + String cdl = "cdl"; + String duration = "duration"; + String topic = "topic"; + String project = "project"; + String credits = "credits"; + + String testXML = ""+ + ""+name+""+ + ""+teacher+""+ + ""+tutor+""+ + ""+cdl+""+ + ""+duration+""+ + ""+topic+""+ + ""+project+""+ + ""+credits+""+ + "\u0000"; + + XSSFMap map = wb.getMapInfo().getXSSFMapByName("CORSO_mapping"); + assertNotNull(map); + XSSFImportFromXML importer = new XSSFImportFromXML(map); + + importer.importFromXML(testXML); + + XSSFSheet sheet=wb.getSheetAt(0); + + XSSFRow row = sheet.getRow(0); + assertTrue(row.getCell(0).getStringCellValue().equals(name)); + assertTrue(row.getCell(1).getStringCellValue().equals(teacher)); + assertTrue(row.getCell(2).getStringCellValue().equals(tutor)); + assertTrue(row.getCell(3).getStringCellValue().equals(cdl)); + assertTrue(row.getCell(4).getStringCellValue().equals(duration)); + assertTrue(row.getCell(5).getStringCellValue().equals(topic)); + assertTrue(row.getCell(6).getStringCellValue().equals(project)); + assertTrue(row.getCell(7).getStringCellValue().equals(credits)); + } finally { + wb.close(); + } } public void testMultiTable() throws Exception{ - - XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("CustomXMLMappings-complex-type.xlsx"); - - String cellC6 = "c6"; - String cellC7 = "c7"; - String cellC8 = "c8"; - String cellC9 = "c9"; - - String testXML = "" + - ""+ - ""+ - ""+ - ""+ - ""+ - ""+ - ""+ - ""+ - ""+ - ""+ - ""+ - ""+ - ""+ - "\u0000"; - - XSSFMap map = wb.getMapInfo().getXSSFMapByName("MapInfo_mapping"); - assertNotNull(map); - XSSFImportFromXML importer = new XSSFImportFromXML(map); - - importer.importFromXML(testXML); - - //Check for Schema element - XSSFSheet sheet=wb.getSheetAt(1); - - assertEquals(cellC6,sheet.getRow(5).getCell(2).getStringCellValue()); - assertEquals(cellC7,sheet.getRow(6).getCell(2).getStringCellValue()); - assertEquals(cellC8,sheet.getRow(7).getCell(2).getStringCellValue()); - assertEquals(cellC9,sheet.getRow(8).getCell(2).getStringCellValue()); - - + try { + String cellC6 = "c6"; + String cellC7 = "c7"; + String cellC8 = "c8"; + String cellC9 = "c9"; + + String testXML = "" + + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + ""+ + "\u0000"; + + XSSFMap map = wb.getMapInfo().getXSSFMapByName("MapInfo_mapping"); + assertNotNull(map); + XSSFImportFromXML importer = new XSSFImportFromXML(map); + + importer.importFromXML(testXML); + + //Check for Schema element + XSSFSheet sheet=wb.getSheetAt(1); + + assertEquals(cellC6,sheet.getRow(5).getCell(2).getStringCellValue()); + assertEquals(cellC7,sheet.getRow(6).getCell(2).getStringCellValue()); + assertEquals(cellC8,sheet.getRow(7).getCell(2).getStringCellValue()); + assertEquals(cellC9,sheet.getRow(8).getCell(2).getStringCellValue()); + } finally { + wb.close(); + } } public void testSingleAttributeCellWithNamespace() throws Exception{ - - XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("CustomXMLMapping-singleattributenamespace.xlsx"); - - String id = "a"; - String displayName = "dispName"; - String ref="19"; - String count = "21"; - - String testXML = ""+ - ""+ - ""+ - "\u0000"; - XSSFMap map = wb.getMapInfo().getXSSFMapByName("table_mapping"); - assertNotNull(map); - XSSFImportFromXML importer = new XSSFImportFromXML(map); - importer.importFromXML(testXML); - - //Check for Schema element - XSSFSheet sheet=wb.getSheetAt(0); - - assertEquals(id,sheet.getRow(28).getCell(1).getStringCellValue()); - assertEquals(displayName,sheet.getRow(11).getCell(5).getStringCellValue()); - assertEquals(ref,sheet.getRow(14).getCell(7).getStringCellValue()); - assertEquals(count,sheet.getRow(18).getCell(3).getStringCellValue()); - + try { + String id = "a"; + String displayName = "dispName"; + String ref="19"; + String count = "21"; + + String testXML = ""+ + ""+ + ""+ + "\u0000"; + XSSFMap map = wb.getMapInfo().getXSSFMapByName("table_mapping"); + assertNotNull(map); + XSSFImportFromXML importer = new XSSFImportFromXML(map); + importer.importFromXML(testXML); + + //Check for Schema element + XSSFSheet sheet=wb.getSheetAt(0); + + assertEquals(id,sheet.getRow(28).getCell(1).getStringCellValue()); + assertEquals(displayName,sheet.getRow(11).getCell(5).getStringCellValue()); + assertEquals(ref,sheet.getRow(14).getCell(7).getStringCellValue()); + assertEquals(count,sheet.getRow(18).getCell(3).getStringCellValue()); + } finally { + wb.close(); + } + } + + + public void testOptionalFields_Bugzilla_55864() throws Exception { + XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("55864.xlsx"); + try { + String testXML = "" + + "" + + "" + + "Albert" + + "Einstein" + + "1879-03-14" + + "" + + ""; + + XSSFMap map = wb.getMapInfo().getXSSFMapByName("PersonInfoRoot_Map"); + assertNotNull(map); + XSSFImportFromXML importer = new XSSFImportFromXML(map); + + importer.importFromXML(testXML); + + XSSFSheet sheet=wb.getSheetAt(0); + + XSSFRow rowHeadings = sheet.getRow(0); + XSSFRow rowData = sheet.getRow(1); + + assertEquals("FirstName", rowHeadings.getCell(0).getStringCellValue()); + assertEquals("Albert", rowData.getCell(0).getStringCellValue()); + + assertEquals("LastName", rowHeadings.getCell(1).getStringCellValue()); + assertEquals("Einstein", rowData.getCell(1).getStringCellValue()); + + assertEquals("BirthDate", rowHeadings.getCell(2).getStringCellValue()); + assertEquals("1879-03-14", rowData.getCell(2).getStringCellValue()); + + // Value for OptionalRating is declared optional (minOccurs=0) in 55864.xlsx + assertEquals("OptionalRating", rowHeadings.getCell(3).getStringCellValue()); + assertNull("", rowData.getCell(3)); + } finally { + wb.close(); + } } } diff --git a/test-data/spreadsheet/55864.xlsx b/test-data/spreadsheet/55864.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..51c9d53ca44d369944a0aafd8405b8526e374c8d GIT binary patch literal 10630 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