Xml解析

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 block
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.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文档的遍历
		 */
		@Override
		public void startDocument() throws SAXException {
			System.out.println("开始读取文档");
		}

		/**
		 * 结束XML文档的遍历
		 */
		@Override
		public void endDocument() throws SAXException {
			System.out.println("结束读取文档");
		}

		/**
		 * 开始一个XML标签的遍历
		 * 参数3:节点名称
		 * 参数4:属性集合
		 * 
		 */
		@Override
		public 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标签遍历
		 */
		@Override
		public void endElement(String uri, String localName, String qName) throws SAXException {
			System.out.println("---结束标签遍历--" + qName);
			
			if ("city".equals(qName)){
				list.add(cityBean);
			}
			//为了避免出现互相干扰,每次标签开始时创建的对象,在结束时都应该进行重置
			cityBean = null;
			
		}

		/**
		 * 读取开始标签和结束标签中间的文字内容
		 */
		@Override
		public 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
优点:
不会预先加载整个文件到内存,边读边加载的方式。适用于机器内存少的情况。
缺点:
没有记忆功能,读过一次的内容,下次如果再读,还是需要重新加载文档。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值