Fix poor XPath performance when importing XSSF from XML
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
This commit is contained in:
parent
9a32a42130
commit
e402698484
@ -132,21 +132,18 @@ public class XSSFImportFromXML {
|
|||||||
// TODO: implement support for denormalized XMLs (see
|
// TODO: implement support for denormalized XMLs (see
|
||||||
// OpenOffice part 4: chapter 3.5.1.7)
|
// OpenOffice part 4: chapter 3.5.1.7)
|
||||||
|
|
||||||
|
Node singleNode = result.item(i).cloneNode(true);
|
||||||
for (XSSFXmlColumnPr xmlColumnPr : table.getXmlColumnPrs()) {
|
for (XSSFXmlColumnPr xmlColumnPr : table.getXmlColumnPrs()) {
|
||||||
|
|
||||||
int localColumnId = (int) xmlColumnPr.getId();
|
int localColumnId = (int) xmlColumnPr.getId();
|
||||||
int rowId = rowOffset + i;
|
int rowId = rowOffset + i;
|
||||||
int columnId = columnOffset + localColumnId;
|
int columnId = columnOffset + localColumnId;
|
||||||
String localXPath = xmlColumnPr.getLocalXPath();
|
String localXPath = xmlColumnPr.getLocalXPath();
|
||||||
localXPath = localXPath.substring(localXPath.substring(1).indexOf('/') + 1);
|
localXPath = localXPath.substring(localXPath.substring(1).indexOf('/') + 2);
|
||||||
|
|
||||||
// Build an XPath to select the right node (assuming
|
|
||||||
// that the commonXPath != "/")
|
|
||||||
String nodeXPath = commonXPath + "[" + (i + 1) + "]" + localXPath;
|
|
||||||
|
|
||||||
// TODO: convert the data to the cell format
|
// TODO: convert the data to the cell format
|
||||||
String value = (String) xpath.evaluate(nodeXPath, result.item(i), XPathConstants.STRING);
|
String value = (String) xpath.evaluate(localXPath, singleNode, XPathConstants.STRING);
|
||||||
logger.log(POILogger.DEBUG, "Extracting with xpath " + nodeXPath + " : value is '" + value + "'");
|
logger.log(POILogger.DEBUG, "Extracting with xpath " + localXPath + " : value is '" + value + "'");
|
||||||
XSSFRow row = table.getXSSFSheet().getRow(rowId);
|
XSSFRow row = table.getXSSFSheet().getRow(rowId);
|
||||||
if (row == null) {
|
if (row == null) {
|
||||||
row = table.getXSSFSheet().createRow(rowId);
|
row = table.getXSSFSheet().createRow(rowId);
|
||||||
|
@ -89,7 +89,7 @@ public class TestXSSFImportFromXML {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test(timeout=10000)
|
||||||
public void testMultiTable() throws IOException, XPathExpressionException, SAXException{
|
public void testMultiTable() throws IOException, XPathExpressionException, SAXException{
|
||||||
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("CustomXMLMappings-complex-type.xlsx");
|
XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("CustomXMLMappings-complex-type.xlsx");
|
||||||
try {
|
try {
|
||||||
@ -102,8 +102,13 @@ public class TestXSSFImportFromXML {
|
|||||||
"<ns1:Schema ID=\""+cellC6+"\" SchemaRef=\"a\" />"+
|
"<ns1:Schema ID=\""+cellC6+"\" SchemaRef=\"a\" />"+
|
||||||
"<ns1:Schema ID=\""+cellC7+"\" SchemaRef=\"b\" />"+
|
"<ns1:Schema ID=\""+cellC7+"\" SchemaRef=\"b\" />"+
|
||||||
"<ns1:Schema ID=\""+cellC8+"\" SchemaRef=\"c\" />"+
|
"<ns1:Schema ID=\""+cellC8+"\" SchemaRef=\"c\" />"+
|
||||||
"<ns1:Schema ID=\""+cellC9+"\" SchemaRef=\"d\" />"+
|
"<ns1:Schema ID=\""+cellC9+"\" SchemaRef=\"d\" />";
|
||||||
"<ns1:Map ID=\"1\" Name=\"\" RootElement=\"\" SchemaID=\"\" ShowImportExportValidationErrors=\"\" AutoFit=\"\" Append=\"\" PreserveSortAFLayout=\"\" PreserveFormat=\"\">"+
|
|
||||||
|
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:DataBinding DataBindingLoadMode=\"\" />"+
|
||||||
"</ns1:Map>"+
|
"</ns1:Map>"+
|
||||||
"<ns1:Map ID=\"2\" Name=\"\" RootElement=\"\" SchemaID=\"\" ShowImportExportValidationErrors=\"\" AutoFit=\"\" Append=\"\" PreserveSortAFLayout=\"\" PreserveFormat=\"\">"+
|
"<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(cellC7,sheet.getRow(6).getCell(2).getStringCellValue());
|
||||||
assertEquals(cellC8,sheet.getRow(7).getCell(2).getStringCellValue());
|
assertEquals(cellC8,sheet.getRow(7).getCell(2).getStringCellValue());
|
||||||
assertEquals(cellC9,sheet.getRow(8).getCell(2).getStringCellValue());
|
assertEquals(cellC9,sheet.getRow(8).getCell(2).getStringCellValue());
|
||||||
|
assertEquals("c5001",sheet.getRow(5000).getCell(2).getStringCellValue());
|
||||||
} finally {
|
} finally {
|
||||||
wb.close();
|
wb.close();
|
||||||
}
|
}
|
||||||
@ -238,4 +244,7 @@ public class TestXSSFImportFromXML {
|
|||||||
|
|
||||||
wb.close();
|
wb.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user