分享

大容量XML文件解析辅助--xml批量分解 - OO - Java - JavaEye论坛

 jijo 2008-09-02






推荐圈子: GT-Grid
更多相关推荐
在项目里面遇到了一些被解析的xml文件超过30M 或 60M 以上的情况, 现在已经不好去说为什么不在一开始产生xml的情况下就把xml 做小点,但是遇到这个问题后,我只能解决问题了,解决问题同时害怕重复发明轮子,我也去看了下现有的xml 解析东西,jdom 的SAXBuilder和 dom4j 的SAXReader都是把XML文件一次读入,xml文件过来 会报溢出的异常 但即使SAXParser是可以批量读入解析,但它也是一次解析完,假设XML文件中有一万条数据,解析后就必须在内存中放这么多的对象 个人觉得这样有些不灵活,就自己做了个小东西来切分 但前提是这个xml文件得有文件头 <?xml version="1.0" encoding="GBK"?> encoding必须跟文件编码格式一致 ,不然解析的时候会出乱码。

个人水平有限,但很希望得到大家的指正,希望大家不吝啬手中的砖头
Java代码 复制代码
  1. package searchRing.ring.util.xmlBufferTool;   
  2.   
  3. import java.io.*;   
  4. import java.util.regex.Pattern;   
  5. import java.util.regex.Matcher;   
  6.   
  7.   
  8. public class XMLBufferTool {   
  9.     private static final int defaultLineCount = 10;   
  10.     private static final int defaultMaxOutputSize = 50;   
  11.   
  12.     private static final Pattern elementPattern = Pattern.compile("<[a-zA-Z]+>");   
  13.     private static final Pattern charSetPattern = Pattern.compile("<[?][[0-9a-zA-Z]|[\\s]|[=]|[\"]|[.]|[-]]+[?]>");   
  14.   
  15.     private StringBuffer xmlContentBuffer;   
  16.   
  17.   
  18.     /* just used to store and output the data divided */  
  19.     XMLOutputBuffer xmlOutput;   
  20.   
  21.     private String charSetTitle = "";   
  22.   
  23.     private String rootElemetMark = "";   
  24.   
  25.     private String childElementMark = "";   
  26.   
  27.   
  28.     InputStreamReader bufferedReader;   
  29.     InputStream fileInputStream;   
  30.   
  31.   
  32.     public XMLBufferTool(String xmlFilePath) {   
  33.   
  34.         this.xmlContentBuffer = new StringBuffer();   
  35.   
  36.         try {   
  37.   
  38.             this.fileInputStream = new FileInputStream(xmlFilePath);   
  39. //             bufferedReader = new InputStreamReader(fileInputStream, "UTF-8");   
  40.             String charSet = getCharSet(xmlFilePath);   
  41.             if (charSet != null)   
  42.                 bufferedReader = new InputStreamReader(fileInputStream, charSet);   
  43.             else  
  44.                 bufferedReader = new InputStreamReader(fileInputStream);   
  45.         } catch (FileNotFoundException fe) {   
  46.             fe.printStackTrace();   
  47.         } catch (UnsupportedEncodingException uee) {   
  48.             uee.printStackTrace();   
  49.         } catch (IOException ioe) {   
  50.             ioe.printStackTrace();   
  51.         }   
  52.   
  53.   
  54.         try {   
  55.             preparePaser();   
  56.         } catch (IOException ie) {   
  57.             ie.printStackTrace();   
  58.         }   
  59.     }   
  60.   
  61.   
  62.     public String getCharSetTitle() {   
  63.         return charSetTitle;   
  64.     }   
  65.   
  66.     public String getRootElemetMark() {   
  67.         return rootElemetMark;   
  68.     }   
  69.   
  70.     private String getCharSet(String filePath) throws IOException {   
  71.         char temp[] = new char[512];   
  72.         FileInputStream tempInput = new FileInputStream(filePath);   
  73.         InputStreamReader tempReader = new InputStreamReader(tempInput);   
  74.   
  75.         int i = tempReader.read(temp);   
  76.   
  77.         tempReader.close();   
  78.         tempInput.close();   
  79.         if (i < 0)   
  80.             return null;   
  81.   
  82.         String tempStr = new String(temp);   
  83.         Matcher m = charSetPattern.matcher(tempStr);   
  84.         if (m.find()) {   
  85.             String charSetStr = tempStr.substring(m.start(), m.end());   
  86.             Pattern tempP = Pattern.compile("[\"][[0-9a-zA-Z]|[-]]+[\"]");   
  87.             Matcher tempM = tempP.matcher(charSetStr);   
  88.             if (tempM.find()) {   
  89.                 String charSet = charSetStr.substring(tempM.start(), tempM.end());   
  90.                 return charSet.substring(1, charSet.length() - 1);   
  91.             }   
  92.         }   
  93.   
  94.         return null;   
  95.     }   
  96.   
  97.   
  98.     private void preparePaser() throws IOException {   
  99.         readSomeLine(defaultLineCount);   
  100.         Matcher m = charSetPattern.matcher(xmlContentBuffer);   
  101.         if (m.find()) {   
  102.             this.charSetTitle = this.xmlContentBuffer.substring(m.start(), m.end());   
  103.             this.xmlContentBuffer.delete(0, m.end());   
  104.         }   
  105.   
  106.         m = elementPattern.matcher(xmlContentBuffer);   
  107.         if (m.find()) {   
  108.             this.rootElemetMark = this.xmlContentBuffer.substring(m.start(), m.end());   
  109.             this.xmlContentBuffer.delete(0, m.end());   
  110.         }   
  111.   
  112.         m = elementPattern.matcher(xmlContentBuffer);   
  113.         if (m.find()) {   
  114.             this.childElementMark = this.xmlContentBuffer.substring(m.start(), m.end());   
  115.         }   
  116.         this.xmlOutput = new XMLOutputBuffer(this.childElementMark);   
  117.   
  118.         parserBuffer();   
  119.     }   
  120.   
  121.   
  122.     private int readSomeLine(int lineCount) throws IOException {   
  123.   
  124.         char buffer[] = new char[1024];   
  125.         int i = 0;   
  126.         int index = 0;   
  127.         /* be careful of the sequence of the boolean caculation */  
  128.         while (i++ < lineCount && (index = this.bufferedReader.read(buffer)) > 0) {   
  129.             xmlContentBuffer.append(buffer, 0, index);   
  130.         }   
  131.   
  132.         return index;   
  133.   
  134.     }   
  135.   
  136.   
  137.     private void parserBuffer() {   
  138.   
  139.         int lastIndex = this.xmlContentBuffer.lastIndexOf(this.childElementMark);   
  140.   
  141.         if (lastIndex > 0) {   
  142.             this.xmlOutput.append(this.xmlContentBuffer.substring(0, lastIndex));   
  143.             this.xmlContentBuffer.delete(0, lastIndex);   
  144.         }   
  145.     }   
  146.   
  147.     public StringBuffer popDividedDataAfterParser() throws IOException {   
  148.   
  149.         while (this.xmlOutput.getItemCount() < defaultMaxOutputSize) {   
  150.             int i = readSomeLine(defaultLineCount);   
  151.             parserBuffer();   
  152.             if (i < 0)   
  153.                 break;   
  154.         }   
  155.   
  156.         if (this.xmlOutput.getItemCount() == 0)   
  157.             return null;   
  158.   
  159.         StringBuffer returnSB = this.xmlOutput.getXmlOutput();   
  160.         this.xmlOutput.clearBuffer();   
  161.         return returnSB.insert(0this.rootElemetMark).append(this.rootElemetMark.replaceFirst("<""</"));   
  162.   
  163.     }   
  164.   
  165.   
  166.     public static void main(String args[]) throws Exception {   
  167.         String str = "F:/ringInfoXML/ringTime.xml";   
  168.   
  169.         XMLBufferTool xmlb = new XMLBufferTool(str);   
  170.   
  171.         StringBuffer s = xmlb.popDividedDataAfterParser();   
  172.         int i = 0;   
  173.         Matcher m = Pattern.compile("<ring>").matcher(s);   
  174.         while (m.find())   
  175.             i++;   
  176.   
  177.         System.out.println(i);   
  178.         System.out.println(s);   
  179.   
  180.   
  181.     }   
  182.   
  183.     private static class XMLOutputBuffer {   
  184.         private StringBuffer xmlOutput;   
  185.         private int itemCount;   
  186.   
  187.         private Pattern markPattern;   
  188.   
  189.         XMLOutputBuffer(String markStr) {   
  190.             this.markPattern = Pattern.compile(markStr);   
  191.             xmlOutput = new StringBuffer();   
  192.             itemCount = 0;   
  193.         }   
  194.   
  195.         public void append(String str) {   
  196.             if (str == null || "".equals(str))   
  197.                 return;   
  198.             this.xmlOutput.append(str);   
  199.             Matcher m = this.markPattern.matcher(str);   
  200.             while (m.find())   
  201.                 this.itemCount++;   
  202.         }   
  203.   
  204.         public void clearBuffer() {   
  205.             xmlOutput = new StringBuffer();   
  206.             this.itemCount = 0;   
  207.         }   
  208.   
  209.         public StringBuffer getXmlOutput() {   
  210.             return xmlOutput;   
  211.         }   
  212.   
  213.         public int getItemCount() {   
  214.             return itemCount;   
  215.         }   
  216.     }   
  217.   
  218.   
  219. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约