2016-04-19 3 views
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> 

Ich mag die Ausgabe alsWie den gleichen XML-Tag mit Stax-Parser

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; 
} 

Mein Pojo Klasse zu lesen. 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; 
} 

Ich habe versucht, den Wert von den Versorgungs Detail <price> Tag-Werte zu erhalten. Während dieses Code ausführen. Ich habe nur die Werte von den zweiten <SupplyDetail> Tag-Werten.

Während dieser Code in meinem Rechner laufen habe ich die Ausgabe als

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 
+0

Sind Sie offen für nicht Pull-basierte Antworten? –

Antwort

1

Sie rufen nie die Einrichter für priceTypeCodeChar, priceAmount2 und currencyCode1 - so die wird immer null drucken.

Zusätzlich wird SpecificationBook für jedes -Tag erstellt und zur Ergebnisliste hinzugefügt, wenn das Schließungs-Tag Product auftritt. Auf diese Weise werden die Werte für jedes neue Price überschrieben.

Der einfachste Weg, um dies zu beheben wäre, Ihre SpecificationBook Klasse zu ändern, entfernen Sie die Price spezifischen Felder und fügen Sie eine Liste von Price Objekte.

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

wo die Price Klasse würde in etwa so aussehen

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

Sie könnten dann überprüfen Sie die Start-Tags für Price, fügen Sie die Details, und wenn Sie das Price End-Tag auftreten, fügen Sie die SpecificationBookprices.

+0

-Danke für die Antwort. Ebenso habe ich so viele Tags mit dem gleichen Tag-Namen. Dazu möchte ich auch separate POJO-Klassen setzen? @ nyname00 – Arunselvan

+0

@Arunselvan Wenn Sie große Teile eines XML mit Stax abbilden müssen, ist es normalerweise eine gute Idee, die XML-Struktur mit Klassen zu "spiegeln" - das macht es viel einfacher, den Parser zu schreiben. – nyname00

+0

meine XML-Dateigröße ist mehr als 2 GB. also habe ich nur den Stax-Parser gemacht – Arunselvan

Verwandte Themen