]> source.dussan.org Git - poi.git/commitdiff
Bug 56730: Fix exporting XML if schema contains ref-elements
authorDominik Stadler <centic@apache.org>
Thu, 28 Aug 2014 21:41:30 +0000 (21:41 +0000)
committerDominik Stadler <centic@apache.org>
Thu, 28 Aug 2014 21:41:30 +0000 (21:41 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1621209 13f79535-47bb-0310-9956-ffa450edef68

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

index 90b89e36bf9e17ba906e0e9edd48dde007faa0cf..d608f961570d4985a7d47c20e1ecc48df26c19b5 100644 (file)
@@ -448,8 +448,8 @@ public class XSSFExportToXml implements Comparator<String>{
             Node node = list.item(i);
             if (node instanceof Element) {
                 if (node.getLocalName().equals("element")) {
-                    Node nameAttribute  = node.getAttributes().getNamedItem("name");
-                    if (nameAttribute.getNodeValue().equals(removeNamespace(elementName))) {
+                    Node element = getNameOrRefElement(node);
+                    if (element.getNodeValue().equals(removeNamespace(elementName))) {
                         indexOf = i;
                         break;
                     }
@@ -460,6 +460,15 @@ public class XSSFExportToXml implements Comparator<String>{
         return indexOf;
     }
 
+       private Node getNameOrRefElement(Node node) {
+               Node returnNode = node.getAttributes().getNamedItem("name");
+        if(returnNode != null) {
+            return returnNode;
+               }
+               
+        return node.getAttributes().getNamedItem("ref");
+       }
+
     private Node getComplexTypeForElement(String elementName,Node xmlSchema,Node localComplexTypeRootNode) {
         String elementNameWithoutNamespace = removeNamespace(elementName);
 
@@ -483,7 +492,7 @@ public class XSSFExportToXml implements Comparator<String>{
             Node node = list.item(i);
             if ( node instanceof Element) {
                 if (node.getLocalName().equals("element")) {
-                    Node nameAttribute  = node.getAttributes().getNamedItem("name");
+                    Node nameAttribute = getNameOrRefElement(node);
                     if (nameAttribute.getNodeValue().equals(elementNameWithoutNamespace)) {
                         Node complexTypeAttribute = node.getAttributes().getNamedItem("type");
                         if (complexTypeAttribute!=null) {
@@ -504,7 +513,7 @@ public class XSSFExportToXml implements Comparator<String>{
             Node node = complexTypeList.item(i);
             if ( node instanceof Element) {
                 if (node.getLocalName().equals("complexType")) {
-                    Node nameAttribute  = node.getAttributes().getNamedItem("name");
+                    Node nameAttribute = getNameOrRefElement(node);
                     if (nameAttribute.getNodeValue().equals(complexTypeName)) {
 
                         NodeList complexTypeChildList  =node.getChildNodes();
index 9621b91eb47612b0deadfe5baa28a3fdd17247a6..d0e118ae20788175702cc5f307e106225b3248e2 100644 (file)
@@ -49,7 +49,8 @@ import org.xml.sax.SAXException;
  * @author Roberto Manicardi
  */
 public final class TestXSSFExportToXML extends TestCase {
-       public void testExportToXML() throws Exception {
+
+    public void testExportToXML() throws Exception {
 
                XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("CustomXMLMappings.xlsx");
 
@@ -580,4 +581,37 @@ public final class TestXSSFExportToXML extends TestCase {
        }
        assertTrue(found);
    }
+
+   public void testRefElementsInXmlSchema_Bugzilla_56730() throws Exception {
+       XSSFWorkbook wb = XSSFTestDataSamples.openSampleWorkbook("56730.xlsx");
+       
+       boolean found = false;
+       for (POIXMLDocumentPart p : wb.getRelations()) {
+           
+           if (!(p instanceof MapInfo)) {
+               continue;
+           }
+           MapInfo mapInfo = (MapInfo) p;
+           
+           XSSFMap map = mapInfo.getXSSFMapById(1);
+           
+           assertNotNull("XSSFMap is null", map);
+           
+           XSSFExportToXml exporter = new XSSFExportToXml(map);
+           ByteArrayOutputStream os = new ByteArrayOutputStream();
+           exporter.exportToXML(os, true);
+           String xmlData = os.toString("UTF-8");
+           
+           assertNotNull(xmlData);
+           assertFalse(xmlData.equals(""));
+           
+           assertEquals("2014-12-31", xmlData.split("<DATE>")[1].split("</DATE>")[0].trim());
+           assertEquals("12.5", xmlData.split("<REFELEMENT>")[1].split("</REFELEMENT>")[0].trim());
+           
+           parseXML(xmlData);
+           
+           found = true;
+       }
+       assertTrue(found);
+   }
 }
diff --git a/test-data/spreadsheet/56730.xlsx b/test-data/spreadsheet/56730.xlsx
new file mode 100644 (file)
index 0000000..9883de4
Binary files /dev/null and b/test-data/spreadsheet/56730.xlsx differ