Xml解析

来源:互联网 发布:淘宝规模 编辑:程序博客网 时间:2024/06/06 09:54
DOM解析XML
步骤:
1、导入dom.jar包

2、创建DocumentBuilderFactory对象,开始进行XML解析

public class DomDemo {public static void main(String[] args) {//一般情况,工程中的相对路径都是相对于当前工程而言File file = new File("src/demo.xml");//使用输入流try {FileInputStream fis = new FileInputStream(file);//此对象用来初始化XML解析前的配置DocumentBuilderFactory docuemntFactory = DocumentBuilderFactory.newInstance();//通过工程模式创建了一个DocuemntBuilder对象//DocumentBuilder是用来操作XML文档DocumentBuilder builder = docuemntFactory.newDocumentBuilder();//开始解析XML文件//加载到内存中的XML输入流对象//返回对象document表示的就是整个XML文档Document doc = builder.parse(fis);//从document中获取xml中的数据//获取省得数据NodeList provinceNodeList = doc.getChildNodes();//getChildNodes获取当前文档下的所有直接子节点//遍历省//获取子节点的个数int provinceSize = provinceNodeList.getLength();for(int i=0; i<provinceSize; i++){Node provinceNode = provinceNodeList.item(i);//获取节点的名称String node = provinceNode.getNodeName();if ("province".equals(node)){//获取省下的所有城市节点NodeList cityNodeList = provinceNode.getChildNodes();//获取city的个数int citySize = cityNodeList.getLength();for(int j=0; j<citySize; j++){//获取子节点Node cityNode = cityNodeList.item(j);//取出所有的节点名称String cityNodeName = cityNode.getNodeName();//获取节点中的文本内容String cityName = cityNode.getTextContent();if (cityNode.hasAttributes()){//获取属性NamedNodeMap attrMap = cityNode.getAttributes();Node codeNode = attrMap.getNamedItem("code");String codeStr = codeNode.getNodeValue();System.out.println(cityNodeName + "--" + cityName + "--" + codeStr);}}}System.out.println(node);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ParserConfigurationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

SAX解析XML
步骤:
1、导入jar包
2、创建SAXParserFactory对象,开始XML的解析
public class SaxDemo {private static List<CityBean> list = new ArrayList<>();public static void main(String[] args) {try {File file = new File("src/demo.xml");FileInputStream fis = new FileInputStream(file);SAXParserFactory parserFactory = SAXParserFactory.newInstance();SAXParser saxParser = parserFactory.newSAXParser();/* *参数1:用于操作XML文档的流 *参数2:用于解析XML的对象 */saxParser.parse(fis, new MyHandler());for(CityBean city:list){System.out.println(city.getName());}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/** * 要进行XML解析。对XML进行拆解 * @author  * */static class MyHandler extends DefaultHandler {private CityBean cityBean;/** * 开始XML文档的遍历 */@Overridepublic void startDocument() throws SAXException {System.out.println("开始读取文档");}/** * 结束XML文档的遍历 */@Overridepublic void endDocument() throws SAXException {System.out.println("结束读取文档");}/** * 开始一个XML标签的遍历 * 参数3:节点名称 * 参数4:属性集合 *  */@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes)throws SAXException {System.out.println("---" + qName);String attrValue = attributes.getValue("code");//获取code属性中值System.out.println("attr--" + attrValue);if ("city".equals(qName)){cityBean = new CityBean();cityBean.setCode(attrValue);}}/** * 结束一个XML标签遍历 */@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {System.out.println("---结束标签遍历--" + qName);if ("city".equals(qName)){list.add(cityBean);}//为了避免出现互相干扰,每次标签开始时创建的对象,在结束时都应该进行重置cityBean = null;}/** * 读取开始标签和结束标签中间的文字内容 */@Overridepublic void characters(char[] ch, int start, int length) throws SAXException {System.out.println(new String(ch,start,length));if (cityBean != null){cityBean.setName(new String(ch,start,length));}}}}
DOM和SAX优缺点
DOM
优点:将整个文档预先加载到内存中,提升了操作的速度。支持XML文件的修改、删除、重新排列等。
缺点:预先加载到内存中,会比较消耗内存,影响机器的运行效率。
SAX
优点:
不会预先加载整个文件到内存,边读边加载的方式。适用于机器内存少的情况。
缺点:
没有记忆功能,读过一次的内容,下次如果再读,还是需要重新加载文档。




原创粉丝点击