1分快3怎么玩_Java解析XML文件的方式

  • 时间:
  • 浏览:6
  • 来源:吉林新闻网_吉林主流媒体_吉林门户网站

    在项目里,朋友往往会把这一配置信息装进去 xml文件里,后后 各部门间会通过xml文件来交换业务数据,这一有后后 朋友会遇到“解析xml文件”的需求。一般来讲,有基于DOM树和SAX的有一种解析xml文件的最好的辦法 ,在这帕累托图里,将分别给朋友演示通过这一种最好的辦法 解析xml文件的一般步骤。

1 XML的文件格式

    XML是可扩展标记语言(Extensible Markup Language)的缩写,在其中,后后后后刚开始英文标签和后后后后刚开始英文标签可能够够配套地突然出现,朋友来看下book.xml你这一例子。   

1	<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2	<books>
3	    <book id="01">
4	        <name>Java</name>
5	        <price>15</price>
6	        <memo>good book</memo>
7	    </book>
8	    <book id="02">
9	       <name>FrameWork</name>
10	       <price>20</price>
11	       <memo>new book</memo>
12	    </book>
13	</books>

    整个xml文件是一有三个小文档(document),其中第1行表示文件头,在第2和第13行里,朋友能看完配套突然出现的books标签,从标签头到标签尾的帕累托图后后们称之为元素(element)。

    这一朋友可能够够后后说,在books元素里,朋友分别于第3到第7行和第8到第12行定义了一有三个小book元素,在每个book元素,比如从第4到第6行,又蕴含着三个小元素,比如第一本书的name元素是<name>Java</name>,它的name元素值是Java。

    在第3行里,朋友还能看完元素里的属性(attribute),比如你这一book元素具有id你这一属性,具体id的属性值是01。

2 基于DOM树的解析最好的辦法

    DOM是Document Object Model(文档对象模型)的缩写,在基于DOM树的解析最好的辦法 里,解析代码会先把xml文档读到内存里,并分派成DOM树的形式,后来 再读取。根据后后 帕累托图里给出的book.xml文档,朋友可能够够绘制出如下形式的DOM树。

    

     其中,books属于根(root)结点,也叫根元素,后后 它蕴含着一有三个小book元素,这一第二层是一有三个小book结点,每个book元素蕴含着三个小元素,这一第三层是6个元素。在下面的ParserXmlByDom.java的代码里,朋友来看下通过DOM树最好的辦法 解析book.xml文档的完正步骤。

1	//省略import相关类库的代码
2	public class ParserXmlByDom {
3		public static void main(String[] args) {
4	        //创建DOM工厂
5			DocumentBuilderFactory domFactory=DocumentBuilderFactory.newInstance();
6			InputStream input = null;
7	        try {
8	            //通过DOM工厂获得DOM解析器
9	            DocumentBuilder domBuilder=domFactory.newDocumentBuilder();
10	            //把XML文档转化为输入流
11	            input=new FileInputStream("src/book.xml");            
12	            //解析XML文档的输入流,得到一有三个小Document
13	            Document doc=domBuilder.parse(input);

    从第5行到第13行,朋友完成了用DOM树解析XML文件的准备工作,具体包括,在第5行里创建了DOM工厂,在第9行通过DOM工厂创建了解析xml文件DocumentBuilder类型对象,在第11行把待解析的xml文件装进去下 一有三个小InputStream类型的对象里,在第13行通过parse最好的辦法 把xml文档解析成一有三个小基于DOM树特征的Document类型对象。    

14	            //得到XML文档的根节点,可能够够能够


根节点是Element类型
15	            Element root=doc.getDocumentElement();
16	            // 得到子节点
17	            NodeList books = root.getChildNodes();

    整个XML文件蕴含在第13行定义的doc对象里,在第15行里,朋友通过getDocumentElement最好的辦法 得到了根节点(也倘若books节点),在第17行,通过getChildNoes最好的辦法 得到该books节点下的所有子节点,后来 后后后后刚开始英文解析整个xml文档。

    可能够够说明的是,在解析前,朋友会通过观察xml文档来了解其中的元素名和属性名,这一在后继的代码里,朋友会针对元素名和属性名进行编程。    

18	            if(books!=null){
19	                for(int i=0;i<books.getLength();i++){
20	                    Node book=books.item(i);
21	                    //获取id属性                      
22	                    if(book.getNodeType()==Node.ELEMENT_NODE){
23	                        String id=book.getAttributes().getNamedItem("id").getNodeValue();
24	                        System.out.println("id is:" + id);
25	                        //遍历book下的子节点
26	                        for(Node node=book.getFirstChild(); node!=null;node=node.getNextSibling()){
27	if(node.getNodeType()==Node.ELEMENT_NODE){
28	    //依次读取book里的name,price和memo一有三个小子元素
29	    if(node.getNodeName().equals("name")){
300	        String name=node.getFirstChild().getNodeValue();
31	        System.out.println("name is:" + name);                                    
32	    }
33	    if(node.getNodeName().equals("price")){
34	        String price=node.getFirstChild().getNodeValue();
35	        System.out.println("price is:" + price);
36	    }
37	    if(node.getNodeName().equals("memo")){
38	          String memo=node.getFirstChild().getNodeValue();
39	          System.out.println("memo is:" + memo);
40	     }
41	   }
42	 }
43	}
44	}
45	}

    第19行的for循环里,朋友是遍历book元素通过观察xml文件,朋友发现book元素突然出现了2次,所有你这一循环会运行两次,因此,book元素一有三个小id属性,所有朋友可能够够通过第23行的代码,得到id属性的值。

    在文档里,book元素有三个小子节点,分别是name,price和memo,这一在代码的26行里,再次使用for循环遍历其中的子节点。在遍历时,朋友通过29到32行的代码获取到了book元素里name的值,通过类式的代码后继的33到40行代码里得到了price和memo你这一有三个小元素的值。    

46	        } catch (ParserConfigurationException e) {
47	            e.printStackTrace();
48	        } catch (FileNotFoundException e) {
49	            e.printStackTrace();
3000	        } catch (IOException e) {
51	            e.printStackTrace();
52	        } catch (SAXException e) {			
53				e.printStackTrace();
54			} catch (Exception e) {			
55				e.printStackTrace();
56			}
57	        //在finally里关闭io流 
58	        finally{
59	        	try {
300					input.close();
61				} catch (IOException e) {
62					e.printStackTrace();
63				}
64	        }
65		}
66	}

    同样地,在解析完成后,在finally从句里,朋友关闭了后后 用到的IO流(input对象)。

3 基于事件的解析最好的辦法

    SAX是Simple API for XML的缩写,不同于DOM的文档驱动,它是事件驱动的,也倘若说,它是有一种基于回调(callback)函数的解析最好的辦法 ,比如后后后后刚开始英文解析xml文档时,会调用朋友本人定义的startDocument函数,从下表里,朋友能看完基于SAX最好的辦法 里的各种回调函数以及它们被调用的时间点。

函数名

调用时间点

startDocument

后后后后刚开始英文解析xml文档时(解析xml文档第一有三个小字符时)会被调用

endDocument

当解析完xml文档时(解析到xml文档最后一有三个小字符时)会被调用

startElement

当解析到后后后后刚开始英文标签一定会被调用,比如在解析“<name>FrameWork</name>”你这一element时,当读到后后后后刚开始英文标签“<name>”时,会被调用

endElement

当解析到后后后后刚开始英文标签一定会被调用,比如在解析“<name>FrameWork</name>”你这一element时,当读到后后后后刚开始英文标签“</name>”时,会被调用

characters

1行后后后后刚开始英文后,遇到后后后后刚开始英文或后后后后刚开始英文标签后后 发生字符,则会调用

2一有三个小标签之间,发生字符,则会调用,比如在解析“<name>FrameWork</name>”时,发现发生FrameWork,则会被调用

3标签和行后后后后刚开始英文符后后 发生字符,则会调用

    从上表里朋友能看完characters最好的辦法 会在多个场合被回调,但朋友最期望的调用场景是第2种,这就要求朋友最好在解析xml文档前分派下它的格式,尽量解决第1和第3种情况。在ParserXmlBySAX.java你这一案例中,朋友通过了编写上述的回调函数,实现了SAX最好的辦法 解析xml文档的功能。    

1	//省略import的代码
2	//基于SAX的解析代码可能够够继承DefaultHandler类
3	public class ParserXmlBySAX extends DefaultHandler{
4		// 记录当前解析到的节点名
5		private String tagName; 
6		//主最好的辦法



7		public static void main(String[] argv) {
8			String uri = "src/book.xml";
9			try {
10				SAXParserFactory parserFactory = SAXParserFactory.newInstance();
11				ParserXmlBySAX myParser = new ParserXmlBySAX();
12				SAXParser parser = parserFactory.newSAXParser();
13				parser.parse(uri, myParser);
14			} catch (IOException ex) {
15				ex.printStackTrace();
16			} catch (SAXException ex) {
17				ex.printStackTrace();
18			} catch (ParserConfigurationException ex) {
19				ex.printStackTrace();
20			} catch (FactoryConfigurationError ex) {
21				ex.printStackTrace();
22			}		
23		}

    在main最好的辦法 的第8行里,朋友指定了待解析xml文档的路径和文件名,在第10行里,朋友创建了SAXParserFactory你这一类型的SAX解析工厂对象。在第12行,朋友通过SAX解析工厂对象,创建了SAXParser你这一类型的解析类。在第13行,通过了parse最好的辦法 启动了解析。

    在上文里朋友就后后 知道,在SAX的最好的辦法 里,是通过调用各种回调函数来完成解析的,这一在代码里,朋友还得自定义各个回调函数,代码如下。    

// 解决到文档结尾时,直接输出,不做任何动作
25		public void endDocument() throws SAXException {
26			System.out.println("endDocument");
27		}
28		// 解决到后后后后刚开始英文标签时,把记录当前标签名的tagName设置成null
29		public void endElement(String uri, String localName, String qName) throws SAXException {
300			tagName = null;
31		}
32		// 后后后后刚开始英文解决文档时,直接输出,不做任何动作
33		public void startDocument() throws SAXException {
34			System.out.println("startDocument");		
35		}
36		// 解决后后后后刚开始英文标签
37		public void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {	
38			if ("book".equals(name)) { //解析book标签的属性 
39	            for (int i = 0; i < attributes.getLength(); i++) {
40	                System.out.println("attribute name is:" + attributes.getLocalName(i)  + "  attribute value:" + attributes.getValue(i)); 
41	            }            
42	        }
43	        //把当前标签的名字记录到tagName你这一变量里  
44			tagName = name; 
45		}
46	    //通过你这一最好的辦法



解析book的一有三个小子元素的值
47		public void characters(char[] ch, int start, int length)  
48	            throws SAXException {  
49	        if(this.tagName!=null){  
3000	            String val=new String(ch,start,length);            
51	            //后后

是name,price或memo,则输出它们的值
52	            if("name".equals(tagName))
53	            { System.out.println("name is:" + val);  }
54	            if("price".equals(tagName))
55	            { System.out.println("price is:" + val); }
56	            if("memo".equals(tagName))
57	            { System.out.println("memo is:" + val);  }
58	        }  
59	    }
300	}

    朋友用tagName来保存当前的标签名,是为了解析book元素的name,price和memo你这一有三个小子元素。

    <name>FrameWork</name>

    比如当解析到name你这一后后后后刚开始英文标签时,在第44行里,startElement会把tagname值设置成name,当解析到FramWork时,后后 它蕴含在一有三个小标签之间,这一会被触发第47行的characters最好的辦法 ,在其中的第52行的if判断里,后后 得知当前的标签名是name,这一会输出FrameWork你这一name元素的值,当解析到</name>你这一后后后后刚开始英文标签时,会触发第29行的endElement最好的辦法 ,在其中的300行里,会把tagName值清空。

    这段代码的输出结果如下,其中第1行和第10行分别是在后后后后刚开始英文解析和完成解析时输出的。

    第2行针对id属性的输出是在startElement最好的辦法 的第40行里被打印的,第3到第5行针对三个小book子元素的输出是在characters最好的辦法 里被打印的。

    第2到第5行是针对第一有三个小book元素的输出,而第6到第9行是针对第一有三个小book。    

1	startDocument
2	attribute name is:id  attribute value:01
3	name is:Java
4	price is:15
5	memo is:good book
6	attribute name is:id  attribute value:02
7	name is:FrameWork
8	price is:20
9	memo is:new book
10	endDocument

4 DOM和SAX有一种解析最好的辦法 的应用场景

    在基于DOM的最好的辦法 里,后后 朋友会把整个xml文档以DOM树的最好的辦法 装载到内存里,这一可能够够边解析边修改,因此还能再次解析后后 被解析过的内容。

    而在SAX的最好的辦法 里,后后 朋友是以基于回调函数的最好的辦法 来解析,这一并非可能够够把整个文档载入到内存,后都可不能否节省内存资源。

    这一说,确定 DOM 还是 SAX,这取决于如下一有三个小个因素。

    第一,后后 朋友在解析时还打算更新xml里的数据,可能够够能够 建议使用DOM最好的辦法 。

    第二,后后 待解析的文件过大,把它完正装载到内存时后后 会影响到内存性能,可能够够能够 建议使用SAX的最好的辦法 。

    第三,后后 朋友对解析的数率单位有一定的要求,可能够够能够 建议使用SAX最好的辦法 ,后后 它比DOM最好的辦法 要快些。

猜你喜欢

5分pk10开奖历史_[明星爆料]香港“爷孙恋”女主要求旧爱道歉 暗示自己仍是处女之身

来源: 凤5分pk10开奖历史凰网 2016-01-1209:05:55   来源:凤凰网本文责任编辑/Linda原文

2020-05-31

飞艇官方_债务总额达100亿美元 贾跃亭债主名单上都有谁?

10月15日,搜狐财经获取到贾跃亭的《另一方申请破产的自愿申请》文件,贾跃亭签名时间为美国时间2019年10月14日。据提供文件的美国加州注册律师、联邦法庭注册律师刘龙珠表述,

2020-05-31

好运时时彩最新版下载_ 睫毛膏的使用小技巧

弯曲你的睫毛膏棒使用更方便将你好运时时彩最新版下载的睫好运时时彩最新版下载毛膏刷头与刷棒弯曲成垂直清况 。这人价值形式让他在刷睫毛的如果更好运时时彩最新版下载容易控制,更容易

2020-05-31

pk10app娱乐 _绿巨人集成墙饰家装小鲜肉 铁粉遍布全国

 近日,由上海、杭州等房地产市场领衔,各地房地产市场再次呈现出一片繁荣的景象。随之而来的,还有pk10app娱乐 家装市场的大热。有不少公司表示在本月家装单量有所增加,其中尤以

2020-05-31

3分pk10官方网站_郑爽拍卖衣服 为作慈善底价都是一元

明星们在二手交易网站上出售买车人的闲置物品机会是或多或少私人衣物吃瓜群众们对此早已见怪不怪,之前 有事先 机会身份原困,或多或少衣物往往是穿了一...明星们在二手交易网站上

2020-05-31