【问题标题】:How to read a large size xml file in Java StaX Xml parser?如何在 Java StaX Xml 解析器中读取大尺寸的 xml 文件?
【发布时间】:2015-12-29 08:52:58
【问题描述】:
<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 标记中检索值。当我使用此代码时。我可以检索第三个&lt;row4&gt; 值。剩余的&lt;row4&gt; 标记值无法检索。请帮我从所有&lt;row4&gt; 标签和&lt;row7&gt; 中获取值

提前感谢您回答这个问题..

【问题讨论】:

  • 你最好先格式化你的代码;它甚至没有编译。

标签: java xml parsing stax


【解决方案1】:

如果你使用JaxB你不需要自己解析XML文件,这就是JaxB的用途! :)


使用JaxB/UnmarshallerXSD读写xml的基本步骤

  • 为您的XML 结构创建一个有效 XSD 文件。
  • 将它放在您的项目文件夹中。
  • 右击XSD文件和auto-generate JAXB classes
  • 使用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。

【讨论】:

  • 我展示的上述 XML 是示例之一。我的文件大小超过 3gb。如果我使用 JAXB,它会抛出一些异常。例外是:com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions @Jordi Castilla。
  • 在我的文件中,我有多个 标签。每个产品标签都包含相同的标签名称。例外是:类有两个同名的属性“contributor” 这个问题与以下位置有关:在公共 java.util.List com.main.File.Bean.Product.getContributor() at com.main.File。 Bean.Product 这个问题与以下位置有关:在 private java.util.List com.main.File.Bean.Product.contributor at com.main.File.Bean.Product
  • 这是一个 xsd 问题,而不是文件大小,在许多可用的在线工具中从您的 xml 创建一个有效的 xsd
  • 并解组 List&lt;Product&gt; 或父类,即:Order
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2016-10-30
  • 2020-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
相关资源
最近更新 更多