]> source.dussan.org Git - poi.git/commitdiff
Fix poor XPath performance when importing XSSF from XML
authorDavid North <dnorth@apache.org>
Tue, 3 Jan 2017 15:41:41 +0000 (15:41 +0000)
committerDavid North <dnorth@apache.org>
Tue, 3 Jan 2017 15:41:41 +0000 (15:41 +0000)
https://bz.apache.org/bugzilla/show_bug.cgi?id=60498

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1777146 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

index 478ed54172918402e70c7cff78451a93db36aee8..0ddf9fec86ba6543d02603634fc74ecd1b522f52 100644 (file)
@@ -132,21 +132,18 @@ public class XSSFImportFromXML {
                 // TODO: implement support for denormalized XMLs (see
                 // OpenOffice part 4: chapter 3.5.1.7)
 
+               Node singleNode = result.item(i).cloneNode(true);
                 for (XSSFXmlColumnPr xmlColumnPr : table.getXmlColumnPrs()) {
 
                     int localColumnId = (int) xmlColumnPr.getId();
                     int rowId = rowOffset + i;
                     int columnId = columnOffset + localColumnId;
                     String localXPath = xmlColumnPr.getLocalXPath();
-                    localXPath = localXPath.substring(localXPath.substring(1).indexOf('/') + 1);
-
-                    // Build an XPath to select the right node (assuming
-                    // that the commonXPath != "/")
-                    String nodeXPath = commonXPath + "[" + (i + 1) + "]" + localXPath;
+                    localXPath = localXPath.substring(localXPath.substring(1).indexOf('/') + 2);
 
                     // TODO: convert the data to the cell format
-                    String value = (String) xpath.evaluate(nodeXPath, result.item(i), XPathConstants.STRING);
-                    logger.log(POILogger.DEBUG, "Extracting with xpath " + nodeXPath + " : value is '" + value + "'");
+                                       String value = (String) xpath.evaluate(localXPath, singleNode, XPathConstants.STRING);
+                    logger.log(POILogger.DEBUG, "Extracting with xpath " + localXPath + " : value is '" + value + "'");
                     XSSFRow row = table.getXSSFSheet().getRow(rowId);
                     if (row == null) {
                         row = table.getXSSFSheet().createRow(rowId);
index 626e104a04e2ad55b2c5ba030e251a0cf20fd8d9..82858038b9ae830dd376406db4a66b94dfa60713 100644 (file)
@@ -89,7 +89,7 @@ public class TestXSSFImportFromXML {
                 }
        }
        
-       @Test   
+       @Test(timeout=10000)
        public void testMultiTable() throws IOException, XPathExpressionException, SAXException{
                XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("CustomXMLMappings-complex-type.xlsx");         
                try {
@@ -102,8 +102,13 @@ public class TestXSSFImportFromXML {
                                                 "<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:Schema ID=\""+cellC9+"\" SchemaRef=\"d\" />";
+               
+                                                for(int i = 10; i< 10010; i++){
+                                                        testXML +=  "<ns1:Schema ID=\"c"+i+"\" SchemaRef=\"d\" />";
+                                                }
+               
+                                               testXML += "<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=\"\">"+
@@ -127,6 +132,7 @@ public class TestXSSFImportFromXML {
                assertEquals(cellC7,sheet.getRow(6).getCell(2).getStringCellValue());
                assertEquals(cellC8,sheet.getRow(7).getCell(2).getStringCellValue());
                assertEquals(cellC9,sheet.getRow(8).getCell(2).getStringCellValue());
+               assertEquals("c5001",sheet.getRow(5000).getCell(2).getStringCellValue());
         } finally {
             wb.close();
         }
@@ -238,4 +244,7 @@ public class TestXSSFImportFromXML {
                
                wb.close();
        }
+       
+       
+       
 }