]> source.dussan.org Git - poi.git/commitdiff
Apply patch for bug 55864 - XSSFImportFromXML.importFromXML() does not support option...
authorDominik Stadler <centic@apache.org>
Tue, 21 Oct 2014 15:56:45 +0000 (15:56 +0000)
committerDominik Stadler <centic@apache.org>
Tue, 21 Oct 2014 15:56:45 +0000 (15:56 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1633404 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xssf/extractor/XSSFImportFromXML.java
src/ooxml/testcases/org/apache/poi/xssf/extractor/TestXSSFImportFromXML.java
test-data/spreadsheet/55864.xlsx [new file with mode: 0644]

index 534ef0d83ee5aeae3e372f4b37162eb2a5c31ce0..1cde38b30a5fcf15033c973a66e8167550d549e4 100644 (file)
@@ -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;
         }
index 5f39f37ceb4ca11aee393dbc47264f789b03a364..16f1ab471499cfb9af83f53a2d44932b03d15549 100644 (file)
@@ -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 = "<CORSO>"+
-                                                 "<NOME>"+name+"</NOME>"+
-                                                 "<DOCENTE>"+teacher+"</DOCENTE>"+ 
-                                                 "<TUTOR>"+tutor+"</TUTOR>"+ 
-                                                 "<CDL>"+cdl+"</CDL>"+
-                                                 "<DURATA>"+duration+"</DURATA>"+ 
-                                                 "<ARGOMENTO>"+topic+"</ARGOMENTO>"+ 
-                                                 "<PROGETTO>"+project+"</PROGETTO>"+
-                                                 "<CREDITI>"+credits+"</CREDITI>"+ 
-                                                 "</CORSO>\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 = "<CORSO>"+
+                                                 "<NOME>"+name+"</NOME>"+
+                                                 "<DOCENTE>"+teacher+"</DOCENTE>"+ 
+                                                 "<TUTOR>"+tutor+"</TUTOR>"+ 
+                                                 "<CDL>"+cdl+"</CDL>"+
+                                                 "<DURATA>"+duration+"</DURATA>"+ 
+                                                 "<ARGOMENTO>"+topic+"</ARGOMENTO>"+ 
+                                                 "<PROGETTO>"+project+"</PROGETTO>"+
+                                                 "<CREDITI>"+credits+"</CREDITI>"+ 
+                                                 "</CORSO>\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 = "<ns1:MapInfo xmlns:ns1=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" SelectionNamespaces=\"\">" +
-                                                "<ns1:Schema ID=\""+cellC6+"\" SchemaRef=\"a\" />"+ 
-                                                "<ns1:Schema ID=\""+cellC7+"\" SchemaRef=\"b\" />"+ 
-                                                "<ns1:Schema ID=\""+cellC8+"\" SchemaRef=\"c\" />"+ 
-                                                "<ns1:Schema ID=\""+cellC9+"\" SchemaRef=\"d\" />"+ 
-                                                "<ns1:Map ID=\"1\" Name=\"\" RootElement=\"\" SchemaID=\"\" ShowImportExportValidationErrors=\"\" AutoFit=\"\" Append=\"\" PreserveSortAFLayout=\"\" PreserveFormat=\"\">"+
-                                                "<ns1:DataBinding DataBindingLoadMode=\"\" />"+ 
-                                                "</ns1:Map>"+
-                                                "<ns1:Map ID=\"2\" Name=\"\" RootElement=\"\" SchemaID=\"\" ShowImportExportValidationErrors=\"\" AutoFit=\"\" Append=\"\" PreserveSortAFLayout=\"\" PreserveFormat=\"\">"+
-                                                "<ns1:DataBinding DataBindingLoadMode=\"\" />"+ 
-                                                "</ns1:Map>"+
-                                                "<ns1:Map ID=\"3\" Name=\"\" RootElement=\"\" SchemaID=\"\" ShowImportExportValidationErrors=\"\" AutoFit=\"\" Append=\"\" PreserveSortAFLayout=\"\" PreserveFormat=\"\">"+
-                                                "<ns1:DataBinding DataBindingLoadMode=\"\" />"+ 
-                                                "</ns1:Map>"+
-                                                "</ns1:MapInfo>\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 = "<ns1:MapInfo xmlns:ns1=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" SelectionNamespaces=\"\">" +
+                                                "<ns1:Schema ID=\""+cellC6+"\" SchemaRef=\"a\" />"+ 
+                                                "<ns1:Schema ID=\""+cellC7+"\" SchemaRef=\"b\" />"+ 
+                                                "<ns1:Schema ID=\""+cellC8+"\" SchemaRef=\"c\" />"+ 
+                                                "<ns1:Schema ID=\""+cellC9+"\" SchemaRef=\"d\" />"+ 
+                                                "<ns1:Map ID=\"1\" Name=\"\" RootElement=\"\" SchemaID=\"\" ShowImportExportValidationErrors=\"\" AutoFit=\"\" Append=\"\" PreserveSortAFLayout=\"\" PreserveFormat=\"\">"+
+                                                "<ns1:DataBinding DataBindingLoadMode=\"\" />"+ 
+                                                "</ns1:Map>"+
+                                                "<ns1:Map ID=\"2\" Name=\"\" RootElement=\"\" SchemaID=\"\" ShowImportExportValidationErrors=\"\" AutoFit=\"\" Append=\"\" PreserveSortAFLayout=\"\" PreserveFormat=\"\">"+
+                                                "<ns1:DataBinding DataBindingLoadMode=\"\" />"+ 
+                                                "</ns1:Map>"+
+                                                "<ns1:Map ID=\"3\" Name=\"\" RootElement=\"\" SchemaID=\"\" ShowImportExportValidationErrors=\"\" AutoFit=\"\" Append=\"\" PreserveSortAFLayout=\"\" PreserveFormat=\"\">"+
+                                                "<ns1:DataBinding DataBindingLoadMode=\"\" />"+ 
+                                                "</ns1:Map>"+
+                                                "</ns1:MapInfo>\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 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>"+ 
-                                                "<ns1:table xmlns:ns1=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" id=\""+id+"\" displayName=\""+displayName+"\" ref=\""+ref+"\">"+
-                                                "<ns1:tableColumns count=\""+count+"\" />"+ 
-                                                "</ns1:table>\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 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>"+ 
+                                                "<ns1:table xmlns:ns1=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" id=\""+id+"\" displayName=\""+displayName+"\" ref=\""+ref+"\">"+
+                                                "<ns1:tableColumns count=\""+count+"\" />"+ 
+                                                "</ns1:table>\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 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" +
+                               "<PersonInfoRoot>" +
+                               "<PersonData>" +
+                               "<FirstName>Albert</FirstName>" +
+                               "<LastName>Einstein</LastName>" +
+                               "<BirthDate>1879-03-14</BirthDate>" +
+                               "</PersonData>" +
+                               "</PersonInfoRoot>";
+               
+               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 (file)
index 0000000..51c9d53
Binary files /dev/null and b/test-data/spreadsheet/55864.xlsx differ