[ 
https://issues.apache.org/jira/browse/XMLBEANS-637?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ronan updated XMLBEANS-637:
---------------------------
    Description: 
h2. Step to reproduce

1- Using this given XML instance to generate an XSD schema with XMLBeans v5.1.0 
(or v3.0.1). Please note that there are two contiguous *<Result>* nodes in the 
XML document.
{code:java}
<data>
    <Code>6065</Code>
    <LocNum>6065</LocNum>
    <StockNum>23123191</StockNum>
    <Vin>1C4NJRFB4GD618747</Vin>
    <YearCode>g</YearCode>
    <MakeCode>JE</MakeCode>
    <ModelCode>PATR</ModelCode>
    <TrimCode>HIAL</TrimCode>
    <BodyCode>S006</BodyCode>
    <EngineCode>0024</EngineCode>
    <FuelType>G</FuelType>
    <TransCode>A</TransCode>
    <ClassCode>80</ClassCode>
    <Color>100</Color>
    <IntColor>2392</IntColor>
    <PrevProdStatus>525</PrevProdStatus>
    <ProdStatus>520</ProdStatus>
    <Mileage>33333</Mileage>
    <LastLotDate>2022-12-12T05:12:53.826-04:00</LastLotDate>
    <LastLotAssign>LB5</LastLotAssign>
    <Result>
        <child-result>test1</child-result>
    </Result>
    <Result>
        <child-result>test2</child-result>
    </Result>
</data> {code}
 

2- Try using this snippet code to generate the XSD schema from the above XML 
instance
{code:java}
public static void main(String[] args) {
    try {
        XmlObject[] xmlInstances = new XmlObject[1];
        xmlInstances[0] = XmlObject.Factory.parse(new 
String(Files.readAllBytes(Paths.get("path_to_the_xml_file"))));

        Inst2XsdOptions inst2XsdOptions = new Inst2XsdOptions();
        inst2XsdOptions.setDesign(Inst2XsdOptions.DESIGN_RUSSIAN_DOLL);
        inst2XsdOptions.setUseEnumerations(Inst2XsdOptions.ENUMERATION_NEVER);
        
inst2XsdOptions.setSimpleContentTypes(Inst2XsdOptions.SIMPLE_CONTENT_TYPES_SMART);

        SchemaDocument[] schemaDocuments = Inst2Xsd.inst2xsd(xmlInstances, 
inst2XsdOptions);
        if (schemaDocuments != null && schemaDocuments.length > 0) {
            System.out.println(schemaDocuments[0].toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
} {code}
h2. Expected Result:

In the output XSD schema, the element *Result* should be an array 
_(maxOccurs="unbounded" minOccurs="0")_
{code:java}
<schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
xmlns="http://www.w3.org/2001/XMLSchema";>
  <element name="data">
    <complexType>
      <sequence>
        <element type="xs:short" name="Code" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="LocNum" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:int" name="StockNum" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="Vin" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="YearCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="MakeCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="ModelCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="TrimCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="BodyCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="EngineCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="FuelType" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="TransCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="ClassCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="Color" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="IntColor" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="PrevProdStatus" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="ProdStatus" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:int" name="Mileage" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:dateTime" name="LastLotDate" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="LastLotAssign" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element name="Result" maxOccurs="unbounded" minOccurs="0">
          <complexType>
            <sequence>
              <element type="xs:string" name="child-result" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>{code}
h2. Actual Result:

The element Result is not an array.
{code:java}
<schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
xmlns="http://www.w3.org/2001/XMLSchema";>
  <element name="data">
    <complexType>
      <choice maxOccurs="unbounded" minOccurs="0">
        <element type="xs:short" name="Code" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="LocNum" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:int" name="StockNum" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="Vin" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="YearCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="MakeCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="ModelCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="TrimCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="BodyCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="EngineCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="FuelType" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="TransCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="ClassCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="Color" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="IntColor" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="PrevProdStatus" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="ProdStatus" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:int" name="Mileage" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:dateTime" name="LastLotDate" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="LastLotAssign" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element name="Result">
          <complexType>
            <sequence>
              <element type="xs:string" name="child-result" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
            </sequence>
          </complexType>
        </element>
      </choice>
    </complexType>
  </element>
</schema>{code}
----
h2. My Investigating Info

Below is information I found while looking for the answer to why this happens.

 

While parsing the input XML instance and calling _*getName()*_ method in 
{_}QNameCache.class{_}, the first *Result* node is added to the table right 
before the table's size reaches the threshold. The first *Result* node is 
allocated to a new memory address as the attached image.

Then, the class executes the *_rehash()_* method to increase the size of the 
table to receive more incoming nodes.

Next, the last *Result* node is added to the table, but it is allocated to a 
separate memory address instead of referring to the first *Result* node (please 
note that their URI, localName, and prefix are exactly the same )

!image-2023-05-30-15-00-38-785.png!

 

After that, in {_}RussianDollStrategy.class{_}, the method 
*_processElementsInComplexType()_* compares those two *Result* QName by using 
the *==* operator to check if they are the same contiguous elements.

The == operator checks whether objects are identical or not. In this case, it 
returns false as those two *Result* QName objects are located in different 
memory addresses, and the consequence is it does not combine the element type.

 

I think this case should be covered by adding one more condition to compare 
their namespaceURI, localPart, and prefix.
{code:java}
else if (currentElem.getName() == child.getName() || 
currentElem.getName().equals(child.getName()) {code}
!image-2023-05-30-15-09-05-151.png!

 

 

 

 

 

  was:
h2. Step to reproduce

1- Using this given XML instance to generate an XSD schema with XMLBeans v5.1.0 
(or v3.0.1). Please note that there are two contiguous *<Result>* nodes in the 
XML document.
{code:java}
<data>
    <Code>6065</Code>
    <LocNum>6065</LocNum>
    <StockNum>23123191</StockNum>
    <Vin>1C4NJRFB4GD618747</Vin>
    <YearCode>g</YearCode>
    <MakeCode>JE</MakeCode>
    <ModelCode>PATR</ModelCode>
    <TrimCode>HIAL</TrimCode>
    <BodyCode>S006</BodyCode>
    <EngineCode>0024</EngineCode>
    <FuelType>G</FuelType>
    <TransCode>A</TransCode>
    <ClassCode>80</ClassCode>
    <Color>100</Color>
    <IntColor>2392</IntColor>
    <PrevProdStatus>525</PrevProdStatus>
    <ProdStatus>520</ProdStatus>
    <Mileage>33333</Mileage>
    <LastLotDate>2022-12-12T05:12:53.826-04:00</LastLotDate>
    <LastLotAssign>LB5</LastLotAssign>
    <Result>
        <child-result>test1</child-result>
    </Result>
    <Result>
        <child-result>test2</child-result>
    </Result>
</data> {code}
 

2- Try using this snippet code to generate the XSD schema from the above XML 
instance
{code:java}
public static void main(String[] args) {
    try {
        XmlObject[] xmlInstances = new XmlObject[1];
        xmlInstances[0] = XmlObject.Factory.parse(new 
String(Files.readAllBytes(Paths.get("path_to_the_xml_file"))));

        Inst2XsdOptions inst2XsdOptions = new Inst2XsdOptions();
        inst2XsdOptions.setDesign(Inst2XsdOptions.DESIGN_RUSSIAN_DOLL);
        inst2XsdOptions.setUseEnumerations(Inst2XsdOptions.ENUMERATION_NEVER);
        
inst2XsdOptions.setSimpleContentTypes(Inst2XsdOptions.SIMPLE_CONTENT_TYPES_SMART);

        SchemaDocument[] schemaDocuments = Inst2Xsd.inst2xsd(xmlInstances, 
inst2XsdOptions);
        if (schemaDocuments != null && schemaDocuments.length > 0) {
            System.out.println(schemaDocuments[0].toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
} {code}
h2. Expected Result:

In the output XSD schema, the element *Result* should be an array 
_(maxOccurs="unbounded" minOccurs="0")_
{code:java}
<schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
xmlns="http://www.w3.org/2001/XMLSchema";>
  <element name="data">
    <complexType>
      <sequence>
        <element type="xs:short" name="Code" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="LocNum" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:int" name="StockNum" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="Vin" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="YearCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="MakeCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="ModelCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="TrimCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="BodyCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="EngineCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="FuelType" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="TransCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="ClassCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="Color" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="IntColor" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="PrevProdStatus" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="ProdStatus" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:int" name="Mileage" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:dateTime" name="LastLotDate" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="LastLotAssign" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element name="Result" maxOccurs="unbounded" minOccurs="0">
          <complexType>
            <sequence>
              <element type="xs:string" name="child-result" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
            </sequence>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>
</schema>Process finished with exit code 0 {code}
h2. Actual Result:

The element Result is not an array.
{code:java}
<schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
xmlns="http://www.w3.org/2001/XMLSchema";>
  <element name="data">
    <complexType>
      <choice maxOccurs="unbounded" minOccurs="0">
        <element type="xs:short" name="Code" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="LocNum" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:int" name="StockNum" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="Vin" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="YearCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="MakeCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="ModelCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="TrimCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="BodyCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="EngineCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="FuelType" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="TransCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="ClassCode" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:byte" name="Color" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="IntColor" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="PrevProdStatus" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:short" name="ProdStatus" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:int" name="Mileage" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:dateTime" name="LastLotDate" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element type="xs:string" name="LastLotAssign" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
        <element name="Result">
          <complexType>
            <sequence>
              <element type="xs:string" name="child-result" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
            </sequence>
          </complexType>
        </element>
      </choice>
    </complexType>
  </element>
</schema>Process finished with exit code 0 {code}
----
h2. My Investigating Info

Below is information I found while looking for the answer to why this happens.

 

While parsing the input XML instance and calling _*getName()*_ method in 
{_}QNameCache.class{_}, the first *Result* node is added to the table right 
before the table's size reaches the threshold. The first *Result* node is 
allocated to a new memory address as the attached image.

Then, the class executes the *_rehash()_* method to increase the size of the 
table to receive more incoming nodes.

Next, the last *Result* node is added to the table, but it is allocated to a 
separate memory address instead of referring to the first *Result* node (please 
note that their URI, localName, and prefix are exactly the same )

!image-2023-05-30-15-00-38-785.png!

 

After that, in {_}RussianDollStrategy.class{_}, the method 
*_processElementsInComplexType()_* compares those two *Result* QName by using 
the *==* operator to check if they are the same contiguous elements.

The == operator checks whether objects are identical or not. In this case, it 
returns false as those two *Result* QName objects are located in different 
memory addresses, and the consequence is it does not combine the element type.

 

I think this case should be covered by adding one more condition to compare 
their namespaceURI, localPart, and prefix.
{code:java}
else if (currentElem.getName() == child.getName() || 
currentElem.getName().equals(child.getName()) {code}
!image-2023-05-30-15-09-05-151.png!

 

 

 

 

 


> Combine same contiguous element types incorrectly while generating XSD from 
> an XML instance
> -------------------------------------------------------------------------------------------
>
>                 Key: XMLBEANS-637
>                 URL: https://issues.apache.org/jira/browse/XMLBEANS-637
>             Project: XMLBeans
>          Issue Type: Bug
>          Components: Cursor
>    Affects Versions: Version 3.0.1, Version 5.1.0
>            Reporter: Ronan
>            Priority: Major
>             Fix For: unspecified
>
>         Attachments: image-2023-05-30-15-00-38-785.png, 
> image-2023-05-30-15-09-05-151.png
>
>
> h2. Step to reproduce
> 1- Using this given XML instance to generate an XSD schema with XMLBeans 
> v5.1.0 (or v3.0.1). Please note that there are two contiguous *<Result>* 
> nodes in the XML document.
> {code:java}
> <data>
>     <Code>6065</Code>
>     <LocNum>6065</LocNum>
>     <StockNum>23123191</StockNum>
>     <Vin>1C4NJRFB4GD618747</Vin>
>     <YearCode>g</YearCode>
>     <MakeCode>JE</MakeCode>
>     <ModelCode>PATR</ModelCode>
>     <TrimCode>HIAL</TrimCode>
>     <BodyCode>S006</BodyCode>
>     <EngineCode>0024</EngineCode>
>     <FuelType>G</FuelType>
>     <TransCode>A</TransCode>
>     <ClassCode>80</ClassCode>
>     <Color>100</Color>
>     <IntColor>2392</IntColor>
>     <PrevProdStatus>525</PrevProdStatus>
>     <ProdStatus>520</ProdStatus>
>     <Mileage>33333</Mileage>
>     <LastLotDate>2022-12-12T05:12:53.826-04:00</LastLotDate>
>     <LastLotAssign>LB5</LastLotAssign>
>     <Result>
>         <child-result>test1</child-result>
>     </Result>
>     <Result>
>         <child-result>test2</child-result>
>     </Result>
> </data> {code}
>  
> 2- Try using this snippet code to generate the XSD schema from the above XML 
> instance
> {code:java}
> public static void main(String[] args) {
>     try {
>         XmlObject[] xmlInstances = new XmlObject[1];
>         xmlInstances[0] = XmlObject.Factory.parse(new 
> String(Files.readAllBytes(Paths.get("path_to_the_xml_file"))));
>         Inst2XsdOptions inst2XsdOptions = new Inst2XsdOptions();
>         inst2XsdOptions.setDesign(Inst2XsdOptions.DESIGN_RUSSIAN_DOLL);
>         inst2XsdOptions.setUseEnumerations(Inst2XsdOptions.ENUMERATION_NEVER);
>         
> inst2XsdOptions.setSimpleContentTypes(Inst2XsdOptions.SIMPLE_CONTENT_TYPES_SMART);
>         SchemaDocument[] schemaDocuments = Inst2Xsd.inst2xsd(xmlInstances, 
> inst2XsdOptions);
>         if (schemaDocuments != null && schemaDocuments.length > 0) {
>             System.out.println(schemaDocuments[0].toString());
>         }
>     } catch (Exception e) {
>         e.printStackTrace();
>     }
> } {code}
> h2. Expected Result:
> In the output XSD schema, the element *Result* should be an array 
> _(maxOccurs="unbounded" minOccurs="0")_
> {code:java}
> <schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
> xmlns="http://www.w3.org/2001/XMLSchema";>
>   <element name="data">
>     <complexType>
>       <sequence>
>         <element type="xs:short" name="Code" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:short" name="LocNum" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:int" name="StockNum" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="Vin" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="YearCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="MakeCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="ModelCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="TrimCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="BodyCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:byte" name="EngineCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="FuelType" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="TransCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:byte" name="ClassCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:byte" name="Color" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:short" name="IntColor" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:short" name="PrevProdStatus" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:short" name="ProdStatus" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:int" name="Mileage" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:dateTime" name="LastLotDate" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="LastLotAssign" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element name="Result" maxOccurs="unbounded" minOccurs="0">
>           <complexType>
>             <sequence>
>               <element type="xs:string" name="child-result" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>             </sequence>
>           </complexType>
>         </element>
>       </sequence>
>     </complexType>
>   </element>
> </schema>{code}
> h2. Actual Result:
> The element Result is not an array.
> {code:java}
> <schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
> xmlns="http://www.w3.org/2001/XMLSchema";>
>   <element name="data">
>     <complexType>
>       <choice maxOccurs="unbounded" minOccurs="0">
>         <element type="xs:short" name="Code" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:short" name="LocNum" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:int" name="StockNum" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="Vin" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="YearCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="MakeCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="ModelCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="TrimCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="BodyCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:byte" name="EngineCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="FuelType" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="TransCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:byte" name="ClassCode" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:byte" name="Color" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:short" name="IntColor" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:short" name="PrevProdStatus" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:short" name="ProdStatus" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:int" name="Mileage" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:dateTime" name="LastLotDate" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element type="xs:string" name="LastLotAssign" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>         <element name="Result">
>           <complexType>
>             <sequence>
>               <element type="xs:string" name="child-result" 
> xmlns:xs="http://www.w3.org/2001/XMLSchema"/>
>             </sequence>
>           </complexType>
>         </element>
>       </choice>
>     </complexType>
>   </element>
> </schema>{code}
> ----
> h2. My Investigating Info
> Below is information I found while looking for the answer to why this happens.
>  
> While parsing the input XML instance and calling _*getName()*_ method in 
> {_}QNameCache.class{_}, the first *Result* node is added to the table right 
> before the table's size reaches the threshold. The first *Result* node is 
> allocated to a new memory address as the attached image.
> Then, the class executes the *_rehash()_* method to increase the size of the 
> table to receive more incoming nodes.
> Next, the last *Result* node is added to the table, but it is allocated to a 
> separate memory address instead of referring to the first *Result* node 
> (please note that their URI, localName, and prefix are exactly the same )
> !image-2023-05-30-15-00-38-785.png!
>  
> After that, in {_}RussianDollStrategy.class{_}, the method 
> *_processElementsInComplexType()_* compares those two *Result* QName by using 
> the *==* operator to check if they are the same contiguous elements.
> The == operator checks whether objects are identical or not. In this case, it 
> returns false as those two *Result* QName objects are located in different 
> memory addresses, and the consequence is it does not combine the element type.
>  
> I think this case should be covered by adding one more condition to compare 
> their namespaceURI, localPart, and prefix.
> {code:java}
> else if (currentElem.getName() == child.getName() || 
> currentElem.getName().equals(child.getName()) {code}
> !image-2023-05-30-15-09-05-151.png!
>  
>  
>  
>  
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org
For additional commands, e-mail: dev-h...@poi.apache.org

Reply via email to