1
<Product>
<SupplyDetail>
<Price>
 <PriceTypeCode>01</PriceTypeCode>
  <DiscountCoded>
    <DiscountCodeType>02</DiscountCodeType>               
    <DiscountCodeTypeName>LSI</DiscountCodeTypeName>
    <DiscountCode>25</DiscountCode></DiscountCoded>
 <PriceAmount>29.95</PriceAmount>
 <CurrencyCode>INR</CurrencyCode>
</Price>
</SupplyDetail>
<SupplyDetail>
<Price>
  <PriceTypeCode>08</PriceTypeCode>
  <PriceAmount>14.32</PriceAmount>
  <CurrencyCode>INR</CurrencyCode>
</Price>
</SupplyDetail>
</Product>

I want the output as

Pricetypecode  : 01
PriceAmount  : 29.95
Currencycode  : INR

Pricetypecode : 08
Price Amount  : 14.32
Currencycode  : INR

BulkFileXMLReader2.java

import com.main.Query.Query;
import com.main.Bean.PriceDetail;
import com.main.Bean.SpecificationBook;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.SQLException;
import java.text.Normalizer;
import java.util.ArrayList;
import java.util.List;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

public static void main(String[] args) throws ClassNotFoundException, XMLStreamException, FileNotFoundException, SQLException {
String fileName = "D:\\SOFTWARE\\txt20160401.xml";
List<SpecificationBook> bookspec = (List<SpecificationBook>) parseXML(fileName);
for(SpecificationBook bean : bookspec){
System.out.println("The Price type code 08="+bean.priceTypeCode);
      System.out.println("The price amount 08 is:"+bean.priceAmount);
      System.out.println("The Currency Code 08 is:"+bean.currencyCode);
      System.out.println("The price typecodechar 01 is:"+bean.priceTypeCodeChar);
      System.out.println("The price amount 01 is:"+bean.priceAmount2);
      System.out.println("The Currency code 01 is:"+bean.currencyCode1);
}
}
private static List<SpecificationBook> parseXML(String fileName) throws ClassNotFoundException, XMLStreamException {
    List<SpecificationBook> empList = new ArrayList<>();
    SpecificationBook emp = null;

    XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance();
    xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true);
    try {
        XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));

   while(xmlEventReader.hasNext()){
            XMLEvent xmlEvent = xmlEventReader.nextEvent();
           if (xmlEvent.isStartElement()){
               StartElement startElement = xmlEvent.asStartElement();
if(startElement.getName().getLocalPart().equals("Product")){

                   emp = new SpecificationBook();
                   }
else if(startElement.getName().getLocalPart().equals("PriceTypeCode")){
                   xmlEvent = xmlEventReader.nextEvent();

emp.setPriceTypeCode(xmlEvent.asCharacters().toString());
               }
                else   
if(startElement.getName().getLocalPart().equals("PriceAmount")){
xmlEvent = xmlEventReader.nextEvent();
emp.setPriceAmount(xmlEvent.asCharacters().toString());
}
else if(startElement.getName().getLocalPart().equals("CurrencyCode")){
xmlEvent = xmlEventReader.nextEvent();
emp.setCurrencyCode(xmlEvent.asCharacters().toString());
               }
           }
if(xmlEvent.isEndElement()){
               EndElement endElement = xmlEvent.asEndElement();

if(endElement.getName().getLocalPart().equals("Product")){
empList.add(emp);
               }
           }

        }
 } catch (FileNotFoundException | XMLStreamException e) {
         e.printStackTrace();
     }
     return empList;
 }

My Pojo class. SpecificationBook.java

  public class SpecificationBook {

@Getter @Setter public String recordReference;
@Getter @Setter public String titleText;
@Getter @Setter public String imprintName;
@Getter @Setter public String publisherName;
@Getter @Setter public String illustrationDesc;
@Getter @Setter public String noofPages;
@Getter @Setter public String priceTypeCode;
@Getter @Setter public int book_id;   
@Getter @Setter public String editionversionnumber;
@Getter @Setter public String recordreference1;
@Getter @Setter public String recordreference2;
@Getter @Setter public String recordreference3  ;
@Getter @Setter public String priceTypeCodeChar;
@Getter @Setter public String priceAmount;
@Getter @Setter public String priceAmount2;
@Getter @Setter public String currencyCode;
@Getter @Setter public String currencyCode1;
}

I tried to get the value from the supply detail <price> tag values. While run this code. i got the values from the second <SupplyDetail> tag values only.

While run this code in my machine I got the output as

The Price type code 08=08
The price amount 08 is:14.83
The Currency Code 08 is:INR 
The price typecodechar 01 is:null
The price amount 01 is:null
The Currency code 01 is:null
1
  • are you open to non-pull based answers? Commented Apr 25, 2016 at 1:45

1 Answer 1

1

You never invoke the setters for priceTypeCodeChar, priceAmount2 and currencyCode1 - so those will always print null.

Additionally, SpecificationBook is created for each Product tag and added to the result list when you encounter the Product's close tag. This way the values will be overwritten for every new Price.

The easiest way to fix this would be to change your SpecificationBook class, remove the Price specific fields and add a list of Price objects.

class SpecificationBook {
    // other fields
    List<Price> prices;
}

where the Price class would look something like

class Price {
    String priceAmount;
    String priceTypeCode;
    String currencyCode;
}

You could then check the start-tags for Price, add the details and, when you encounter the Price end-tag, add it to the SpecificationBook's prices.

Sign up to request clarification or add additional context in comments.

3 Comments

-thanks for the answer. Like wise i have so many tags having the same tag name. For that also i want to put separate POJO classes? @nyname00
@Arunselvan when you need to map large parts of an XML using Stax it is usually a good idea to "mirror" (parts of) the XML structure with classes - this makes it a lot easier to write the parser.
my xml file size is more than 2gb. so only i used to do Stax parser

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.