求XML达人帮忙!我有一个860MB左右的XML文件,要怎么分割它?
新手刚刚接触这方面的问题 请教一下大侠们 帮帮忙 这个XML文件太大了 我用notepad打开后就是未响应 现在不是很清楚里面的具体结构 然后向把XML文件先分成几个小文件一个一个打开 看结构 不然太卡了 sax和DOM到底怎么用 网上搜了一个4种方法区别 看了以后还是不太懂 我用的DOM4J解析器 也可以使用sax方法么??好多疑问 求教!!
[解决办法]
我这可以通过 python 把你这个文件 分割成一份一份的可以帮助你查看xml的内容
#!C:\Python27 python# -*- coding:UTF-8 -*-import os,syssize = 80*1024*1024partnum = 0input = open("c:\\test.zip",'rb')text = input.read(size)while text: partnum = partnum + 1 fileoutput = open("c:\\ttt\\test%04d"%partnum+".zip",'wb') fileoutput.write(text) fileoutput.close() text = input.read(size)input.close()
[解决办法]
package com.huawei.hdm.util;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.XMLReader;/** * The StrutsXMLParser class parse struts.xml. */public class StrutsXMLParser { Map<String, Object> map = new HashMap<String, Object>(); class StrutsXMLHandler extends SAXHandler { private String cls; private boolean isUrl; private List<String> fileList = new ArrayList<String>(); @Override public void startDocument() throws SAXException { } @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { if("include".equals(qName)) { fileList.add(atts.getValue("file")); } if("constant".equals(qName)) { map.put(atts.getValue("name"), atts.getValue("value")); } if("action".equals(qName)) { cls = atts.getValue("class"); } if("result".equals(qName) && "error".equals(atts.getValue("name"))) { isUrl = true; } } @Override public void characters(char[] ch, int start, int length) throws SAXException { if(cls != null && isUrl) { String url = new String(ch, start, length); if(!map.containsKey(cls)) { cls = cls.substring(cls.lastIndexOf(".") + 1); map.put(cls, url); } isUrl = false; cls = null; } } @Override public void endElement(String namespaceURI, String localName, String qName) throws SAXException { } @SuppressWarnings("unchecked") @Override public void endDocument() throws SAXException { if(fileList.size() > 0) { map.put("fileList", fileList); } } } @SuppressWarnings("unchecked") public Map<String, Object> parser(String xml) throws Exception { String path = xml.substring(0, xml.lastIndexOf("/") + 1); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser sp = spf.newSAXParser(); XMLReader xr = sp.getXMLReader(); StrutsXMLHandler handler = new StrutsXMLHandler(); xr.setContentHandler(handler); xr.parse(xml); List<String> fileList = (List<String>) map.get("fileList"); if(fileList != null) { map.remove("fileList"); Iterator it = fileList.iterator(); while(it.hasNext()) { parser(path + it.next()); } } return map; } public static void main(String[] args) { try { Map<String, Object> map = new StrutsXMLParser().parser("struts.xml"); Iterator<String> it = map.keySet().iterator(); while(it.hasNext()) { String key = it.next(); String val = String.valueOf(map.get(key)); System.err.println(key + " = " + val); } } catch(Exception e) { e.printStackTrace(); } }}
[解决办法]
试试这个,估计也不可能快:
package com.ruihui.test;import java.io.FileInputStream;import java.io.IOException;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class XmlParseTest { public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { FileInputStream in=new FileInputStream("d:/test.xml"); SAXParserFactory spf=SAXParserFactory.newInstance(); SAXParser parser=spf.newSAXParser(); parser.parse(in, new MyHandler()); in.close(); }}class MyHandler extends DefaultHandler{ private int space=0; @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { for(int i=0;i<space;i++){ System.out.print('\t'); } System.out.println(qName); space ++; } @Override public void endElement(String uri, String localName, String qName) throws SAXException { space --; }}