簡體   English   中英

如何使用 Stax 解析器讀取相同的 xml 標簽

[英]How to read the same xml tag using Stax parser

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

我希望輸出為

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 課。 規格書.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

您永遠不會調用priceTypeCodeCharpriceAmount2currencyCode1的設置器 - 因此它們將始終打印null

此外,會為每個Product標簽創建SpecificationBook並在您遇到Product的關閉標簽時將其添加到結果列表中。 這樣,每個新Price的值都會被覆蓋。

解決此問題的最簡單方法是更改​​您的SpecificationBook類,刪除Price特定字段並添加Price對象列表。

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

Price類看起來像

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

然后,您可以檢查Price的開始標簽,添加詳細信息,並在遇到Price結束標簽時將其添加到SpecificationBookprices

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM