Java学习笔记(十)——xml

【前面的话】

学习过程中还是效率不够高,老是容易注意力不集中,着急啊。不能在这样了,要好好学习,好好努力。

学习过程中的小知识点总结,基础知识,选择阅读

xml定义】

定义可扩展标记语言(英语:eXtensible Markup Language,简称: XML),是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,既可以选择国际通用的标记语言,比如HTML,也可以使用像XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

用途:XML设计用来传送及携带数据信息,不用来表现或展示数据,HTML语言则用来表现数据,所以XML用途的焦点是它说明数据是什么,以及携带数据信息。

1. 丰富文件(Rich Documents)- 自定文件描述并使其更丰富

  • 属于文件为主的XML技术应用
  • 标记是用来定义一份资料应该如何呈现  

2. 元数据(Metadata)- 描述其它文件或网络资讯

  • 属于资料为主的XML技术应用
  • 标记是用来说明一份资料的意义

3. 配置文档(Configuration Files)- 描述软件设置的参数

xml和html区别:(在java核心技术中有如下的说明:)

  • 与html不同,xml是大小写敏感的
  • 在html中,如果上下文可以分清哪里是段落或列表的结尾,那么结束标签就可以省略,但是在xml中结束标签式绝对不能省略的。
  • 在xml中,只有一个标签而没有相对应的结束标签的元素必须以/结尾,比如<img src=”coffeecup.pen”/>。这样,解析器就知道不需要查找</img>标签了。
  • 在xml中,属性值必须用引号括起来,在html中,引号可有可无。如<applet code =”MyApplet.class”width=300 height=300>对于html是合法的,但是对于xml是不合法的。在xml中必须使用width=”300”。
  • 在html中属性名可以没有值,例如<input type=”radio” name=”language” value=”Java” checked>。但是在xml中,所有属性必须都有属性值。比如checked=”true”或者checked=”checked”

举例:(这个想起了在初中的时候,上课总是和同学传字条,下面就是用xml和同学一起传纸条的内容)

<?xml version="1.0" encoding=”UTF-8”?>
<小纸条>
<收件人>大头</收件人>
<发件人>强哥</发件人>
<主题>吃饭</主题>
<具体內容>下课等我,我们一起去吃饭? </具体內容>
</小纸条>

这XML文档仅是纯粹的信息标签,这些标签意义的展开依赖于应用它的程序。

【四种操作】

下面定义xml 文档,然后通过四种方法对于xml文档进行操作。

四种操作都是对于xmltest.xml文档的操作,所以xmltest.xml文档时共用的

  • xmltest.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <RESULT>
 3   <VALUE>
 4      <NO>陕A1234</NO>
 5      <ADDR>西安</ADDR>
 6   </VALUE>
 7    <VALUE>
 8      <NO>陕C1234</NO>
 9      <ADDR>宝鸡</ADDR>
10   </VALUE>
11 </RESULT>
View Code

1. DOM

  • XmlTest.java
 1 import java.io.*; 
 2 import java.util.*; 
 3 import org.w3c.dom.*; 
 4 import javax.xml.parsers.*; 
 5 
 6 public class XmlTest{ 
 7     public static void main(String arge[]){
 8         long lasting =System.currentTimeMillis();
 9         try{
10             File f=new File("xmltest.xml"); 
11             DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); 
12             DocumentBuilder builder=factory.newDocumentBuilder(); 
13             Document doc = builder.parse(f); 
14             NodeList nl = doc.getElementsByTagName("VALUE"); 
15             for (int i=0;i<nl.getLength();i++){ 
16                 System.out.print("车牌号码:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue()); 
17                 System.out.println("车主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue()); 
18             }
19             
20         }catch(Exception e){ 
21             e.printStackTrace(); 
22         }
23     }
24 }
View Code
  • 运行结果
1 车牌号码:陕A1234车主地址:西安
2 车牌号码:陕C1234车主地址:宝鸡
View Code

2. JDOM(需要导入jdom.jar包

  • XmlTest.java
 1 import java.io.*; 
 2 import java.util.*; 
 3 import org.jdom.*; 
 4 import org.jdom.input.*; 
 5 
 6 public class XmlTest { 
 7     public static void main(String arge[]) { 
 8         long lasting = System.currentTimeMillis(); 
 9         try { 
10             SAXBuilder builder = new SAXBuilder(); 
11             Document doc = builder.build(new File("xmltest.xml")); 
12             Element foo = doc.getRootElement(); 
13             List allChildren = foo.getChildren(); 
14             for(int i=0;i<allChildren.size();i++) { 
15                 System.out.println("车牌号码:" + ((Element)allChildren.get(i)).getChild("NO").getText());
16                 System.out.println("车主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText()); 
17                 }
18             }catch (Exception e) { 
19                 e.printStackTrace(); 
20             }
21     }
22 }
View Code
  • 运行结果:
1 车牌号码:陕A1234
2 车主地址:西安
3 车牌号码:陕C1234
4 车主地址:宝鸡
View Code

3. DOM4J(需要导入dom4j.jar包

  • XmlTest.java
 1 import java.io.*; 
 2 import java.util.*; 
 3 import org.dom4j.*; 
 4 import org.dom4j.io.*; 
 5 
 6 public class XmlTest { 
 7     public static void main(String arge[]) { 
 8         long lasting = System.currentTimeMillis(); 
 9         try { 
10             File f = new File("xmltest.xml"); 
11             SAXReader reader = new SAXReader(); 
12             Document doc = reader.read(f); 
13             Element root = doc.getRootElement(); 
14             Element foo; 
15             for (Iterator i = root.elementIterator("VALUE");i.hasNext();){ 
16                 foo = (Element)i.next(); 
17                 System.out.println("车牌号码:" + foo.elementText("NO")); 
18                 System.out.println("车主地址:" + foo.elementText("ADDR")); 
19                 } 
20             } catch (Exception e) { 
21                 e.printStackTrace(); 
22             }
23         }
24 }
View Code
  • 运行结果:
1 车牌号码:陕A1234
2 车主地址:西安
3 车牌号码:陕C1234
4 车主地址:宝鸡
View Code

4. SAX(还没有完全理解清楚,存在问题,在输出的时候,会把xml文档中</NO>后面的内容页输出)

  • XmlTest.java

 

 1 import org.xml.sax.*; 
 2 import org.xml.sax.helpers.*; 
 3 import javax.xml.parsers.*;
 4 import java.util.Stack;
 5 
 6 public class XmlTest extends DefaultHandler { 
 7     Stack tags = new Stack(); 
 8     public XmlTest() { 
 9         super(); 
10         } 
11     public void characters(char ch[], int start, int length) throws SAXException { 
12         String tag = (String) tags.peek(); //查看栈顶对象而不删除它
13         if (tag.equals("NO")) { //如果栈顶多想是"NO"输出
14             System.out.println("车牌号码:" +new String(ch, start, length));
15             } 
16         if (tag.equals("ADDR")) {//如果栈顶多想是"ADDR"输出
17             System.out.println("地址:" + new String(ch, start, length)); 
18             }
19         } 
20     public void startElement(String url,String localName,String qName,Attributes attrs) { 
21         tags.push(qName);
22         } 
23     public static void main(String args[]) { 
24         long lasting = System.currentTimeMillis(); 
25         try { 
26             SAXParserFactory sf = SAXParserFactory.newInstance(); 
27             SAXParser sp = sf.newSAXParser(); 
28             XmlTest reader = new XmlTest(); 
29             sp.parse(new InputSource("xmltest.xml"), reader);     
30             } catch (Exception e) { 
31                 e.printStackTrace(); 
32                 } 
33         System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");
34         } 
35 }
View Code

 

  • 运行结果:
 1 车牌号码:陕A1234
 2 车牌号码:
 3      
 4 地址:西安
 5 地址:
 6   
 7 地址:
 8    
 9 车牌号码:陕C1234
10 车牌号码:
11      
12 地址:宝鸡
13 地址:
14      
15 地址:123
16 地址:
17   
18 地址:
19 
20 运行时间:51毫秒
View Code

【参考资料】

  1. http://download.csdn.net/detail/shizhending/4067649#comment

【后面的话】

学习总会有学不下去的时候,没事,好好休息休息,再接着来。加油吧,少年。

分享:《许三观卖血记》——记忆深刻。

  1. 一乐吃不到1元7角的一碗面,一个人在哭泣的时候。
  2. 许三观为了给一乐治疗肝炎连续卖血。
  3. 当许三观自己的血卖不出。生活的状况也不需要他再去卖血,他哭泣的说:以前的生活灾难,都是靠我卖血度过的,那么现在我的血卖不出了,以后生活的灾难我们怎么度过。

——TT

posted @ 2014-02-24 20:57  赞恩  阅读(1166)  评论(2编辑  收藏  举报