2016-04-19 1 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> 

Я хочу вывод какКак читать один и тот же XML-тег с помощью Стакс парсер

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

Мой Pojo класса. 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; 
} 

Я пытался получить значение из значений тегов деталь питания <price>. Во время запуска этого кода. Я получил значения из второго значения тегов <SupplyDetail>.

Хотя запустить этот код в моей машине я получил выход в

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

Вы не можете отвечать на сообщения? –

ответ

1

Вы никогда не ссылаться на сеттеры для priceTypeCodeChar, priceAmount2 и currencyCode1 - так что те всегда будет печатать null.

Кроме того, SpecificationBook создан для каждого тега Product и добавлен в список результатов, когда вы сталкиваетесь с тегом закрытия Product. Таким образом, значения будут перезаписаны для каждого нового Price.

Самый простой способ исправить это - изменить класс SpecificationBook, удалить Price конкретных полей и добавить список Price объектов.

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

где Price класс будет выглядеть как

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

Затем можно проверить старт-теги для Price, добавить детали и, когда вы сталкиваетесь с Price конечного тега, добавьте его в SpecificationBookprices.

+0

-понятия для ответа. Как и мудрый, у меня так много тегов, имеющих одно и то же имя тега. Для этого также хочу поместить отдельные классы POJO? @ nyname00 – Arunselvan

+0

@Arunselvan, когда вам нужно отображать большие части XML с помощью Stax, обычно рекомендуется «зеркально отображать» (части) структуру XML с классами - это значительно упрощает запись парсера. – nyname00

+0

Размер моего xml-файла превышает 2gb. поэтому только я использовал парсер Stax – Arunselvan

Смежные вопросы