xml文件的解析

XML的解析 【與java程序來進行配合】

xml的解析方式有兩種:dom和sax
dom解析
根據xml層級結構 在內存中分配一個樹形結構 把xml中的每部分都會封裝成一個對象
在圖中分析了兩種解析方式【先講dom解析】
想要解析xml 還要具備一個東西:xml的解析器
不同的公司或者組織提供了針對dom和sax解析方式的解析器 並且提供了對應的api
sun公司提供了 解析器:jaxp 【先講的】
dom4j組織提供瞭解析器:dom4j [常用的是dom4j]
jdom組織提供瞭解析器:jdom
dom4j --> jdom的升級版
jaxp的解析器解析xml
是sun公司提供的  也就是jaxp是javase的一部分 對應的解析器的類放置在javax.xml.parsers包中
在該包下有四個類
DocumentBuilder
是一個抽象類 無法直接實例化 
實例化方式:DocumentBuilderFactory.newDocumentBuilder() 方法獲取
先創建一個factory對象 調用對象方法newDocumentBuilder()
DocumentBuilder builder=factory.newDocumentBuilder();
該類中有一個方法:獲取解析對應的xml文件 並返回該xml文件對應的Document文檔對象
Document parse(String uri) 
 
  想解析文檔中有哪些內容 【去查看Document類型的api】
 
  元素類型 Element
  屬性對象類型 Attr
  文本對象類型 Text
 
  他們幾個都是接口  父接口是Node
DocumentBuilderFactory
SAXParser
SAXParserFactory
使用jaxp解析器用dom的解析方式實現xml的解析
實現查詢操作
實現查詢第一個name的值
添加節點
刪除節點
遍歷所有節點
使用jaxp解析器用sax的解析方式實現xml的解析
sax 不支持增刪改的操作的 只能用於查詢
事件驅動的形式 是從上往下走的
使用dom4j解析器採用把dom和sax給融合了
dom4j不是javase的一部分 如果想使用的話 -- 在工程中導入dom4j的jar包
 
獲得解析器
SAXReader sax = new SAXReader();
根據解析器 綁定文檔 並返回Document
Document doc = sax.read("文件路徑")
XPath
xml獲取數據時 一層一層的獲得 如果想獲得層次較深的數據  再一層一層去獲取就比較麻煩
dom4j就提供了一種新的功能XPath
XPath就是一個表達式 根據這個表達式可以獲得指定層的元素
表達式格式:這裏斜線後面第一個都是根節點【或者直接 // 開頭沒與此要求】                                          A是根元素
1./A/B/C
想獲取的是A下B下的C
2.//B
獲得任意層的B元素
//D/B
獲得任意層的D下的B元素
3./A/B/C/*
獲得c下的所有元素
/*/*/*/B
無論哪一層 只要第四層是B的元素
4. /A/B[1]
A下的第一個B
/A/B[last()]
A下的最後一個B
5.
//B[@id1]
所有層下 具有id1屬性的B
6. 
//B[@id1="m"]
獲得所有層 屬性名師id1 屬性值是m的B元
dom4j默認是不支持XPath 如果想使用XPath這種格式 需要導入包 jaxen.jar
dom4j中提供了兩個方法來支持XPath
selectNodes("XPath的表達式")
獲得多個節點
selectSingleNode("XPath表達式")
根據XPath表達式獲得單個節點


這裏有需要導入的jar  我放在了lib.jar壓縮包中,大家可以解壓使用

案例:

例一:dom解析XML
import java.io.IOException;
import java.util.Iterator;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class DomParsers {
public static void main(String[] args) throws Exception {
selectAll();
// addNode();
// deleteNode();
showNodes();
}

public static void selectAll() throws ParserConfigurationException, SAXException, IOException {
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc=builder.parse("src\\day30\\person.xml");
NodeList list= doc.getElementsByTagName("name");
NodeList listage= doc.getElementsByTagName("age");
 
for (int i=0; i<list.getLength();i++) {
String value=list.item(i).getTextContent();
System.out.println(value);
System.out.println(listage.item(i).getTextContent());
}
}
public static void addNode() throws ParserConfigurationException, SAXException, IOException, TransformerException {
//1.創建解析器對象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
//獲取document對象
Document doc = builder.parse("src\\day30\\person.xml");
// 獲取節點
Node pNode = doc.getElementsByTagName("p").item(0);
// 創建sex節點
Element sex=doc.createElement("sex");
//添加節點
pNode.appendChild(sex);
//創建文本節點
Text text=doc.createTextNode("女");
sex.appendChild(text);
//回寫類
TransformerFactory tfFactory=TransformerFactory.newInstance();
Transformer transformer=tfFactory.newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src\\day30\\person.xml"));
}

public static void deleteNode() throws ParserConfigurationException, SAXException, IOException, TransformerException {
//1.創建解析器對象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
//獲取document對象
Document doc = builder.parse("src\\day30\\person.xml");
// 獲取節點
Node pNode = doc.getElementsByTagName("sex").item(0);
//獲取父節點
Node parentNode=pNode.getParentNode();
//通過父節點刪除子節點
parentNode.removeChild(pNode);
//回寫類
TransformerFactory tfFactory=TransformerFactory.newInstance();
Transformer transformer=tfFactory.newTransformer();
transformer.transform(new DOMSource(doc), new StreamResult("src\\day30\\person.xml"));
}

public static void showNodes() throws SAXException, IOException, ParserConfigurationException {
//1.創建解析器對象
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
//獲取document對象
Document doc = builder.parse("src\\day30\\person.xml");
getNode(doc);
}
public static void getNode(Node node) {
//node的getType() 返回值是short類型
if (node.getNodeType() == Node.ELEMENT_NODE) {
String name = node.getNodeName();
System.out.println(name);
}
//獲取所有子節點
NodeList nList = node.getChildNodes();
for(int i=0;i<nList.getLength();i++) {
Node n = nList.item(i);
// 遞歸調用
getNode(n);
}
}

}
例子二:SAX解析XML
package day30.SAXParsers;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParse1 {
public static void main(String[] args) throws Exception {
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser sParser=factory.newSAXParser();
MyHandler handler=new MyHandler();
sParser.parse(new InputSource("src/day30/pczz001.xml"), handler);
}
}
class MyHandler extends DefaultHandler{
boolean flag=false;
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("xml文檔開始!");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("xml文檔開始!");
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("province")&& attributes.getValue(0).equals("北京")) {
flag=true;
System.out.println(attributes.getType(0));
}
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("province")) {
flag=false;
}
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (flag) {
System.out.println(new String(ch,start,length));
}
}

}
例子三:dom4j 方式解析方法,該方法是以後經常用到的比較簡單的,利用了dom4j.jar封裝的方法

package day30.SAXParsers;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParse1 {
public static void main(String[] args) throws Exception {
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser sParser=factory.newSAXParser();
MyHandler handler=new MyHandler();
sParser.parse(new InputSource("src/day30/pczz001.xml"), handler);
}
}
class MyHandler extends DefaultHandler{
boolean flag=false;
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("xml文檔開始!");
}
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("xml文檔開始!");
}

@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("province")&& attributes.getValue(0).equals("北京")) {
flag=true;
System.out.println(attributes.getType(0));
}
}

@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("province")) {
flag=false;
}
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (flag) {
System.out.println(new String(ch,start,length));
}
}
}

大家複製使用時注意導入jar,並且注意不同類引用的不同jar包下的父類,不要引用錯了這裏就無法得到正確結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章