<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
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
.