private static final POILogger LOG = POILogFactory.getLogger(XSSFExportToXml.class);
private XSSFMap map;
-
+ private final HashMap<String, Integer> indexMap = new HashMap<>();
/**
* Creates a new exporter and sets the mapping to be used when generating the XML output document
*
tableMappings.put(commonXPath, table);
}
+ indexMap.clear();
xpaths.sort(this);
-
+ indexMap.clear();
+
for(String xpath : xpaths) {
XSSFSingleXmlCell simpleXmlCell = singleXmlCellsMappings.get(xpath);
String[] leftTokens = leftXpath.split("/");
String[] rightTokens = rightXpath.split("/");
+ String samePath = "";
int minLength = leftTokens.length< rightTokens.length? leftTokens.length : rightTokens.length;
String rightElementName = rightTokens[i];
if (leftElementName.equals(rightElementName)) {
+ samePath += "/" + leftElementName;
localComplexTypeRootNode = getComplexTypeForElement(leftElementName, xmlSchema, localComplexTypeRootNode);
} else {
- int leftIndex = indexOfElementInComplexType(leftElementName,localComplexTypeRootNode);
- int rightIndex = indexOfElementInComplexType(rightElementName,localComplexTypeRootNode);
- if (leftIndex!=-1 && rightIndex!=-1) {
- if ( leftIndex < rightIndex) {
- return -1;
- }if ( leftIndex > rightIndex) {
- return 1;
- }
- } /*else {
- // NOTE: the xpath doesn't match correctly in the schema
- }*/
+ return indexOfElementInComplexType(samePath, leftElementName, rightElementName,localComplexTypeRootNode);
}
}
return 0;
}
- private int indexOfElementInComplexType(String elementName,Node complexType) {
+ private int indexOfElementInComplexType(String samePath,String leftElementName,String rightElementName,Node complexType) {
if(complexType == null) {
- return -1;
+ return 0;
}
- int indexOf = -1;
int i = 0;
Node node = complexType.getFirstChild();
- final String elementNameWithoutNamespace = removeNamespace(elementName);
+ final String leftWithoutNamespace = removeNamespace(leftElementName);
+ int leftIndexOf = getAndStoreIndex(samePath, leftWithoutNamespace);
+ final String rightWithoutNamespace = removeNamespace(rightElementName);
+ int rightIndexOf = getAndStoreIndex(samePath, rightWithoutNamespace);
- while (node != null) {
+ while (node != null && (rightIndexOf==-1||leftIndexOf==-1)) {
if (node instanceof Element && "element".equals(node.getLocalName())) {
- Node element = getNameOrRefElement(node);
- if (element.getNodeValue().equals(elementNameWithoutNamespace)) {
- indexOf = i;
- break;
+ String elementValue = getNameOrRefElement(node).getNodeValue();
+ if (elementValue.equals(leftWithoutNamespace)) {
+ leftIndexOf = i;
+ indexMap.put(samePath+"/"+leftWithoutNamespace, leftIndexOf);
+ }
+ if (elementValue.equals(rightWithoutNamespace)) {
+ rightIndexOf = i;
+ indexMap.put(samePath+"/"+rightWithoutNamespace, leftIndexOf);
}
}
i++;
node = node.getNextSibling();
}
- return indexOf;
+ if(leftIndexOf == -1 || rightIndexOf == -1) {
+ return 0;
+ }
+ return Integer.compare(leftIndexOf, rightIndexOf);
+ }
+
+ private int getAndStoreIndex(String samePath,String withoutNamespace) {
+ String withPath = samePath+"/"+withoutNamespace;
+ return indexMap.getOrDefault(withPath, -1);
}
private Node getNameOrRefElement(Node node) {