1.xml文件是一".xml"名结尾的文件
2.xml 主要用于存储数据,和传输数据
3.xml文件的应用
1)用于不同平台间的通信
2)用于不同平台间的数据共享
3)用于不同应用程序之间的通信
4.在java程序中如何获取xml文件的内容
四种解析方式
Dom
Sax
Dom4j
jDom
前两种是由java提供的解析方式因此不需要去下载jar包,而后两种是相关的组织提供的解析xml的方式因此要去网站下载相关的jar包.
5.dom方式解析步骤
1)创建DocumentBuilderFactory对象
2)创建DocumentBuilder对象
3)通过DocumentBuilder对象的parse方法加载***.xml文件到项目下
Dom解析方式
1.第一步创建books.xml ,books.xml文 件要在项目的根目录下
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id ="1"> <name>冰与火之歌</name> <author>乔治马丁</author> <year>2014</year> <price>88</price> </book> <book id ="2"> <name>安徒生童话</name> <year>2004</year> <price>98</price> <language>English</language> </book> </bookstore>
2.创建DOM解析测试类
package com.imooc.domtest; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class DomTest { public static void main(String[] args) { //创建DocumentBuilderFactory对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { //创建DocumentBuilder对象 DocumentBuilder db= dbf.newDocumentBuilder(); //通过DocumentBuilder对象的parse方法加载books.xml文件到项目下 Document document= db.parse("books.xml"); //获取所有book节点的集合 NodeList booklist =document.getElementsByTagName("book"); //通过nodelist的getLength()的方法可以获取booklist的长度 System.out.println("一共有"+booklist.getLength()+"本书"); //遍历每一个book节点 for (int i = 0; i < booklist.getLength(); i++) { System.out.println("=================下面开始遍历第" + ( i + 1 ) + "本书的内容================="); //通过item(i)方法获取一个book节点,nodelist的索引是从0开始的 //(未知属性个数) Node book =booklist.item(i); //获取book节点所有属性的集合 NamedNodeMap attrs =book.getAttributes(); System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength()+ "个属性"); //遍历book的属性 for (int j = 0; j < attrs.getLength(); j++) { //通过item(index)获取book节点的某一个属性,index从0开始 Node attr = attrs.item(j); //获取属性名 System.out.print("属性名: "+ attr.getNodeName()); //获取属性值 System.out.println("---属性值: "+ attr.getNodeValue()); } /** * 已知属性个数 * 前提:已经知道book节点有且只能有一个id属性 * 将book节点进行强制类型转换,转换成Element */ /* Element book = (Element) booklist.item(i); //通过getAttribute("id")方法获取属性值 String attrValue = book.getAttribute("id"); System.out.println("id属性的属性值为:"+attrValue);*/ //解析book节点的子节点 NodeList childNodes = book.getChildNodes(); //遍历childNodes 获取每个节点的节点名和节点值 System.out.println("第" + (i+1)+"本书共有"+childNodes.getLength()+"个子节点"); for (int k = 0; k < childNodes.getLength(); k++) { //区分text类型的node以及element类型的node节点 if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){ //获取了element类型节点的节点名 System.out.print("第"+(k+1)+"个节点的节点名 : " +childNodes.item(k).getNodeName()); //获取了element类型节点的节点值 //System.out.println(" ---节点值 :"+childNodes.item(k).getFirstChild().getNodeValue()); System.out.println(" ---节点值 :"+childNodes.item(k).getTextContent()); } } System.out.println("=================结束遍历第" + ( i + 1 ) + "本书的内容================="); } } 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(); } } }
3.DOM解析运行的结果
一共有2本书 =================下面开始遍历第1本书的内容================= 第1本书共有1个属性 属性名: id---属性值: 1 第1本书共有9个子节点 第2个节点的节点名 : name ---节点值 :冰与火之歌 第4个节点的节点名 : author ---节点值 :乔治马丁 第6个节点的节点名 : year ---节点值 :2014 第8个节点的节点名 : price ---节点值 :88 =================结束遍历第1本书的内容================= =================下面开始遍历第2本书的内容================= 第2本书共有1个属性 属性名: id---属性值: 2 第2本书共有9个子节点 第2个节点的节点名 : name ---节点值 :安徒生童话 第4个节点的节点名 : year ---节点值 :2004 第6个节点的节点名 : price ---节点值 :98 第8个节点的节点名 : language ---节点值 :English =================结束遍历第2本书的内容=================
SAX 解析方式
1.创建第一步创建books.xml ,books.xml文 件要在项目的根目录下
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book id ="1"> <name>冰与火之歌</name> <author>乔治马丁</author> <year>2014</year> <price>88</price> </book> <book id ="2"> <name>安徒生童话</name> <year>2004</year> <price>98</price> <language>English</language> </book> </bookstore>
2.创建SAX解析测试类
package com.imooc.test; import java.io.IOException; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.SAXException; import com.imooc.entity.Book; import com.imooc.handler.SAXParserHandler; public class SAXTest { public static void main(String[] args) { //获取SAXParserFactory的实例 SAXParserFactory factory = SAXParserFactory.newInstance(); //通过SAXParserFactory的实例(factory) 获取SAXParser实例 try { SAXParser parser =factory.newSAXParser(); //创建SAXParserHandler 的对象 SAXParserHandler handler = new SAXParserHandler(); parser.parse("books.xml", handler); System.out.println("~! ~! ~! 共有"+handler.getBookList().size()+"本书"); for (Book book :handler.getBookList() ) { System.out.println(book.getId()); System.out.println(book.getName()); System.out.println(book.getAuthor()); System.out.println(book.getYear()); System.out.println(book.getPrice()); System.out.println(book.getLanguage()); System.out.println("-----finish------"); } } 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(); } } }
2.SAX解析是要通过Sax提供的handler进行对xml解析,所以要创建SAXParserHandler 继承DefaultHandler
package com.imooc.handler; import java.util.ArrayList; import javax.xml.stream.events.StartElement; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.imooc.entity.Book; public class SAXParserHandler extends DefaultHandler { int bookIndex = 0; String value = null; Book book = null; private ArrayList<Book> bookList = new ArrayList<Book>(); public ArrayList<Book> getBookList() { return bookList; } public void setBookList(ArrayList<Book> bookList) { this.bookList = bookList; } /** * 用来遍历xml的开始标签 * 解析xml元素 */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { //调用DefaultHandler类的startElement方法 super.startElement(uri, localName, qName, attributes); //开始解析book元素的属性 if ( qName.equals("book") ){ //创建book对象 book = new Book(); bookIndex ++; System.out.println("=================开始遍历第"+bookIndex+"本书的内容================="); /*//已知属性的名称,根据属性的名称获取属性值 String value = attributes.getValue("id"); System.out.println("book的属性值是 :" +value );*/ //未知book元素下属性的名称以及个数,如何获取属性名和属性值 int num = attributes.getLength(); for (int i = 0; i < num; i++) { System.out.print("book元素的第" + (i + 1) + "个属性名是:" + attributes.getQName(i) ); System.out.println(" --- 属性值是"+ attributes.getValue(i)); if (attributes.getQName(i).equals("id")) { book.setId(attributes.getValue(i)); } } } else if (!qName.equals("book") && !qName.equals("bookstore")){ System.out.print("节点名 :" +qName + "---"); } } /** * 用来遍历xml的结束标签 */ @Override public void endElement(String uri, String localName, String qName) throws SAXException { //调用DefaultHandler类的endElement方法 super.endElement(uri, localName, qName); //判断是否针对一本书已经遍历结束 if (qName.equals("book")) { bookList.add(book); book = null; System.out.println("=================结束遍历第"+bookIndex+"本书的内容================="); } else if (qName.equals("name")){ book.setName(value); } else if (qName.equals("author")){ book.setAuthor(value); } else if (qName.equals("price")){ book.setPrice(value); } else if (qName.equals("year")){ book.setYear(value); } else if (qName.equals("language")){ book.setLanguage(value); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); value = new String(ch, start, length); if (!value.trim().equals("")) { System.out.println("节点值是 :"+value); } } /** * 标识解析开始 */ @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("SAX解析开始"); } /** * 标识解析结束 */ @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("SAX解析结束"); } }
3.如果要将java解析的数据依然有xml的数据结构要创建相应的实体类
package com.imooc.entity; public class Book { private String id; private String name; private String author; private String price; private String year; private String language; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } }
4.SAX 解析测试运行结果
SAX解析开始 =================开始遍历第1本书的内容================= book元素的第1个属性名是:id --- 属性值是1 节点名 :name---节点值是 :冰与火之歌 节点名 :author---节点值是 :乔治马丁 节点名 :year---节点值是 :2014 节点名 :price---节点值是 :88 =================结束遍历第1本书的内容================= =================开始遍历第2本书的内容================= book元素的第1个属性名是:id --- 属性值是2 节点名 :name---节点值是 :安徒生童话 节点名 :year---节点值是 :2004 节点名 :price---节点值是 :98 节点名 :language---节点值是 :English =================结束遍历第2本书的内容================= SAX解析结束 ~! ~! ~! 共有2本书 1 冰与火之歌 乔治马丁 2014 88 null -----finish------ 2 安徒生童话 null 2004 98 English -----finish------