簡體   English   中英

如何在Java StaX Xml解析器中讀取大尺寸的xml文件?

[英]How to read a large size xml file in Java StaX Xml parser?

<Product>
<Row1>97545214</Row1>
<Row2>
  <value>01</value>
</Row2>
<Row4>
  <number>1</number>
  <role>A01</role>
  <name>Paul </name>
</Row4>
<Row4>
  <number>1</number>
  <role>A01</role>
  <name>James </name>
</Row4>
<Row4>
  <number>1</number>
  <role>A01</role>
  <name>John </name>
</Row4>
<Row5>
  <Code>01</Code>
  <Measurement>9.00</Measurement>
  <UnitCode>in</UnitCode>
</Row5>
<Row5>
  <Code>02</Code>
  <Measurement>6.00</Measurement>
  <UnitCode>in</UnitCode>
</Row5>
<Row5>
  <Code>03</Code>
  <Measurement>1.09</Measurement>
  <UnitCode>in</UnitCode>
</Row5>
<Row7>
  <price>
     <Code>01</PriceTypeCode>
     <Amount>62.95</Amount>
     <currency>USD</currency>
  </Price>
</Row7>
  <Row7>
  <price>
     <Code>01</PriceTypeCode>
     <Amount>62.95</Amount>
     <currency>USD</currency>
  </Price>

如何在Java StaX解析器中讀取此xml。 這是示例xml。 原始文件大小超過2 GB。 所以只有我去StaX解析器。 我的Java類是BulkFileReader.java

public class BulkFileReader {


public static void main(String[] args) throws ClassNotFoundException, XMLStreamException, FileNotFoundException {

    String fileName = "E:\\Arunselvan\\D2 to D5\\xml files\\combine.xml";


    List<BookSpecBean> bookspec = (List<BookSpecBean>) parseXML(fileName);

    for(BookSpecBean bean : bookspec){
      System.out.println("The Row1="+bean.row1);
      System.out.println("The Row2="+bean.row2);
    System.out.println("The Number="+bean.number);
        System.out.println("The Role="+bean.role);
        System.out.println("The Name="+bean.name);
    System.out.println("The code="+bean.code);
        System.out.println("The amount="+bean.amount);
        System.out.println("The currency="+bean.currency);


      System.out.println("===========================================");

       new Query().InsertMetaData1(bean);
          }

    System.out.println("XML Completed Successfully");

}

private static List<BookSpecBean> parseXML(String fileName) {
    List<BookSpecBean> empList = new ArrayList<>();
    BookSpecBean 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 BookSpecBean();

                   }
               }
               //set the other varibles from xml elements
               else if(startElement.getName().getLocalPart().equals("Row1")){
                   xmlEvent = xmlEventReader.nextEvent();
                   emp.setRow1(xmlEvent.asCharacters().getData());
               }
      else if(startElement.getName().getLocalPart().equals("Row2")){
                   xmlEvent = xmlEventReader.nextEvent();
                   emp.setRow2(xmlEvent.asCharacters().getData().replace("'", ""));
               }

               String qname = startElement.getName().getLocalPart();
               if(qname.equalsIgnoreCase("Row4")){

            xmlEvent = xmlEventReader.nextEvent();

        }
    else if(startElement.getName().getLocalPart().equals("number")){
        xmlEvent = xmlEventReader.nextEvent();
        emp.setnumber(xmlEvent.asCharacters().getData());
        }
    else if(startElement.getName().getLocalPart().equals("role")){
        xmlEvent = xmlEventReader.nextEvent();
        emp.setrole(xmlEvent.asCharacters().getData());
        }
    else if(startElement.getName().getLocalPart().equals("name")){
    xmlEvent = xmlEventReader.nextEvent();
    emp.setname(xmlEvent.asCharacters().getData());
        }

}
    if(xmlEvent.isEndElement()){
        EndElement endElement = xmlEvent.asEndElement();
        if(endElement.getName().getLocalPart().equals("Row4")){
        empList.add(emp);
    }
}

        else if(startElement.getName().getLocalPart().equals("code")){
            xmlEvent = xmlEventReader.nextEvent();
            emp.setcode(xmlEvent.asCharacters().toString());
        }
        else if(startElement.getName().getLocalPart().equals("Amount")){
            xmlEvent = xmlEventReader.nextEvent();
            emp.setamount(xmlEvent.asCharacters().getData());
        }
        else if(startElement.getName().getLocalPart().equals("currency")){
            xmlEvent = xmlEventReader.nextEvent();
            emp.setcurrency(xmlEvent.asCharacters().getData());
        }
           }
           //if Employee end element is reached, add employee object to list
           if(xmlEvent.isEndElement()){
               EndElement endElement = xmlEvent.asEndElement();
               if(endElement.getName().getLocalPart().equals("Product")){
                   empList.add(emp);
               }
           }

        }

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

}

我使用此Java代碼從xml標記中檢索值。 我能夠檢索第三個<row4>值。 其余的<row4>標記值無法檢索。 請幫助我從所有<row4>標記和<row7>

在此先感謝您回答這個問題。

如果您使用的是JaxB則無需自己解析XML文件 ,這就是制作JaxB的原因! :)


使用JaxB / UnmarshallerXSD讀寫xml的基本步驟

  • 創建您的XML結構的有效 XSD文件。
  • 將其放在您的項目文件夾中。
  • 右鍵單擊XSD文件並自動生成JAXB類
  • 使用Unmarshaller從XML文件填充自動生成的類:

     JAXBContext jc = JAXBContext.newInstance(Product.class); String fileName = "E:\\\\Arunselvan\\\\D2 to D5\\\\xml files\\\\combine.xml"; Unmarshaller u = jc.createUnmarshaller(); Product product = (Product) u.unmarshal(new FileInputStream(filename)); 

就是這樣... JaxB將處理類,屬性,填充,寫入/讀取xml。

暫無
暫無

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

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