今天項目中,用到了遍歷讀取項目一個目錄下的.xml文件,這裏用的是dom4j,其中jaxen-1.1-beta-6.jar是dom4j中的xpath技術,dom4j默認支持裏邊的方法,該包作用是根據規則快速獲取要找的節點,這裏沒用到。
package com.wms.core.utils.baseline;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class dom4jReeadXml {
/**
* 拿到配置文件所在目錄,遍歷出其中所有的配置文件,存入到一個String[]數組中
* @return listFilePath
*/
public static String[] initmethod(String confPath){
//配置文件所在目錄名
String taskconfPath = confPath;
//拿到目錄所在路徑
String listfilepath = dom4jReeadXml.class.getClassLoader().getResource(taskconfPath).getPath();
//System.out.println(listfilepath);
//遍歷該目錄下所有的配置文件,存入到String[]數組中
File listfile = new File(listfilepath);
String[] listFilePath = listfile.list();
//如果listFilePath下邊還有目錄則循環遍歷知道發現.properties配置文件
/*for(String l : listFilePath){
File innerfile = new File(l);
if(innerfile.isDirectory()){
initmethod(l);
}
}*/
return listFilePath;
}
public void readXml(String configfolder){
String[] listFilePath = initmethod(configfolder);
//System.out.println(listFilePath[0]);
try {
//1.創建一個xml解析器對象
SAXReader reader = new SAXReader();
for(int j=0;j<listFilePath.length;j++){
//2.讀取xml文檔,返回Document對象
Document doc = reader.read(new File(dom4jReeadXml.class.getClassLoader().getResource(configfolder+"/"+listFilePath[j]).getPath()));
Element root=doc.getRootElement();//獲取根節點
Map<String, Object> map = new HashMap<String, Object>();
List<Element> elements = root.elements();
for(Element element : elements){
if("scripts".equals(element.getName())){
List<Element> scripts = element.elements();
Map<String, String> scriptMap = new HashMap<String, String>();
for(int i=0;i<scripts.size();i++){
Element script = scripts.get(i);
Element id = script.element("id");
Element value = script.element("value");
String idName = id.getName();
String idText = id.getText();
String valueName = value.getName();
String valueText = value.getText();
//System.out.println(idName+":"+idText+"^^^^^^^"+valueName+":"+valueText);
scriptMap.put(idText, valueText);
}
map.put("scripts", scriptMap);
}else{
String name = element.getName();
String text = element.getText();
//System.out.println(name+":"+text);
map.put(name, text);
}
}
//System.out.println(map);
Map<String, String> scriptMap = (Map<String, String>) map.get("scripts");
for(String key :scriptMap.keySet()){
String value = scriptMap.get(key);
//這調用其它方法
/*Linux_1Process lp = new Linux_1Process();
lp.setFileName(listFilePath[j]);
lp.process(key, value);*/
}
}
} catch (DocumentException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static void main(String[] args) {
dom4jReeadXml read = new dom4jReeadXml();
read.readXml("com/wms/core/utils/baseline/xmlPath");
}
}
XML入門
引入
HTML: 負責網頁的結構
CSS: 負責網頁的樣式(美觀)
Javascript: 負責在瀏覽器端與用戶進行交互。
負責靜態的網頁製作的語言
HTML語言特點:
1)由標籤組成。 <title> <p> <hr/> <br/>
2)語法結構鬆散的 <p></p> <p> <P>
大小寫不區分
結束標籤和開始標籤不一定匹配
<html> <head> <title>this is title</title> </head> <body> <p>html標籤</p> <P>html標籤</P> <abc>abc標籤</abc> 自定義標籤 </body> </html> |
這種自定義標籤可以把他們叫做xml標籤。
HTML和XML的區別
HTML XML
名稱: HyperText Markup Languae(超文本標記語言) ExtendMarkup Languge(可擴展標籤語言)
標籤: 標籤是w3c組成指定,固定的,約100來個 標籤由開發者自己制定的(要按照一定的語法定義)
作用: 負責網頁的結構 1)描述帶關係的數據(作爲軟件的配置文件):包 含與被包含的關係
properties文件: key-value
name=eric
password=123456
<user>
<name>eric</name>
<password>123456</password>
</user>
作爲數據的載體(存儲數據,小型的“數據庫”) 數據的載體(小型的“數據庫”)XML語法
xml文件以xml後綴名結尾。
xml文件需要使用xml解析器去解析。瀏覽器內置了xml解析器。
標籤
語法: <student></student> 開始標籤 標籤體內容 結束標籤
1)<student/> 或 <student></student> 空標籤。沒有標籤體內容
2)xml標籤名稱區分大小寫。
3)xml標籤一定要正確配對。
4)xml標籤名中間不能使用空格
5)xml標籤名不能以數字開頭
6)注意: 在一個xml文檔中,有且僅有一個根標籤
屬性
語法: <Student name="eric">student</Student>
注意:
1)屬性值必須以引號包含,不能省略,也不能單雙引號混用!!!
2)一個標籤內可以有多個屬性,但不能出現重複的屬性名!!!
文檔聲明
語法: <?xml version="1.0" encoding="utf-8"?>
version: xml的版本號
encoding: 解析xml文件時查詢的碼錶(解碼過程時查詢的碼錶)
注意:
1)如果在ecplise工具中開發xml文件,保存xml文件時自動按照文檔聲明的encoding來保存文件。
2)如果用記事本工具修改xml文件,注意保存xml文件按照文檔聲明的encoding的碼錶來保存。
轉義字符
在xml中內置了一些特殊字符,這些特殊字符不能直接被瀏覽器原樣輸出。如果希望把這些特殊字符按照原樣輸出到瀏覽器,對這些特殊字符進行轉義。轉義之後的字符就叫轉義字節。
特殊字符 轉義字符
< <
> >
" "
& &
空格 &nsbp;
CDATA塊
作用: 可以讓一些需要進行包含特殊字符的內容統一進行原樣輸出。
<![CDATA[
<itast>
</itast>
]]>
處理指令
作用: 告訴xml解析如果解析xml文檔
案例: <?xml-stylesheet type="text/css" href="1.css"?> 告訴xml解析該xml文檔引用了哪個css文件
需要提前xml內容可以使用xml-stylesheet指令指令
XML解析
引入
xml文件除了給開發者看,更多的情況使用程序讀取xml文件的內容。這叫做xml解析
XML解析方式(原理不同)
DOM解析
SAX解析
XML解析工具
DOM解析原理:
1)JAXP (oracle-Sun公司官方)
2)JDOM工具(非官方)
3)Dom4J工具(非官方)
三大框架(默認讀取xml的工具就是Dom4j)
.......
SAX解析原理:
1)Sax解析工具(oracle-sun公司官方)
什麼是DOM解析
DOM解析原理:xml解析器一次性把整個xml文檔加載進內存,然後在內存中構建一顆Document的對象樹,通過Document對象,得到樹上的節點對象,通過節點對象訪問(操作)到xml文檔的內容。
Dom4j工具
非官方,不在jdk中。
使用步驟:
1)導入dom4j的核心包。dom4j-1.6.1.jar
2)編寫Dom4j讀取xml文件代碼
public static void main(String[] args) { try { //1.創建一個xml解析器對象 SAXReader reader = new SAXReader(); //2.讀取xml文檔,返回Document對象 Document doc = reader.read(new File("./src/contact.xml")); System.out.println(doc); } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException(e); } } |
Domj4讀取xml文件
節點:
Iterator Element.nodeIterator(); //獲取當前標籤節點下的所有子節點
標籤:
Element Document.getRootElement(); //獲取xml文檔的根標籤
Element ELement.element("標籤名") //指定名稱的第一個子標籤
Iterator<Element> Element.elementIterator("標籤名");//指定名稱的所有子標籤
List<Element> Element.elements(); //獲取所有子標籤
屬性:
String Element.attributeValue("屬性名") //獲取指定名稱的屬性值
Attribute Element.attribute("屬性名");//獲取指定名稱的屬性對象
Attribute.getName() //獲取屬性名稱
Attibute.getValue() //獲取屬性值
List<Attribute> Element.attributes(); //獲取所有屬性對象
Iterator<Attribute> Element.attibuteIterator(); //獲取所有屬性對象
文本:
Element.getText(); //獲取當前標籤的文本
Element.elementText("標籤名") //獲取當前標籤的指定名稱的子標籤的文本內容
總結:
1)XML的作用
配置文件(最常見)
作爲數據庫
2)XML語法
3)XML解析(DOM解析)
3.1 DOM解析原理
3.2 Dom4j工具(基於DOM解析)
讀取:
節點
標籤節點
屬性節點
文本節點
Dom4j修改xml文檔
寫出內容到xml文檔
XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)
wirter.write(Document);
修改xml文檔的API
增加:
DocumentHelper.createDocument() 增加文檔
addElement("名稱") 增加標籤
addAttribute("名稱",“值”) 增加屬性
修改:
Attribute.setValue("值") 修改屬性值
Element.addAtribute("同名的屬性名","值") 修改同名的屬性值
Element.setText("內容") 修改文本內容
刪除
Element.detach(); 刪除標籤
Attribute.detach(); 刪除屬性
xPath技術
引入
問題:當使用dom4j查詢比較深的層次結構的節點(標籤,屬性,文本),比較麻煩!!!
xPath作用
主要是用於快速獲取所需的節點對象。
在dom4j中如何使用xPath技術
1)導入xPath支持jar包 。 jaxen-1.1-beta-6.jar
2)使用xpath方法
List<Node> selectNodes("xpath表達式"); 查詢多個節點對象
Node selectSingleNode("xpath表達式"); 查詢一個節點對象
xPath語法
/ 絕對路徑 表示從xml的根位置開始或子元素(一個層次結構)
// 相對路徑 表示不分任何層次結構的選擇元素。
* 通配符 表示匹配所有元素
[] 條件 表示選擇什麼條件下的元素
@ 屬性 表示選擇屬性節點
and 關係 表示條件的與關係(等價於&&)
text() 文本 表示選擇文本內容
SAX解析工具
SAX解析工具- Sun公司提供的。內置在jdk中。org.xml.sax.*
核心的API:
SAXParser類: 用於讀取和解析xml文件對象
parse(File f,DefaultHandler dh)方法:解析xml文件
參數一: File:表示 讀取的xml文件。
參數二: DefaultHandler:SAX事件處理程序。使用DefaultHandler的子類
例如:{
1.創建SAXParser對象
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
2.調用parse方法
parser.parse(new File("./src/contact.xml"),new MyDefaultHandler());
}[一個類繼承class類名(extends DefaultHandler) 在調用是創建傳進去
DefaultHandler類的API:
void startDocument() : 在讀到文檔開始時調用
void endDocument() :在讀到文檔結束時調用
void startElement(String uri, String localName, String qName, Attributes attributes) :讀到開始標籤時調用
void endElement(String uri, String localName, String qName) :讀到結束標籤時調用
void characters(char[] ch, int start, int length) :讀到文本內容時調用
============DOM解析 vs SAX解析 ========
DOM解析 |
SAX解析 |
原理: 一次性加載xml文檔,不適合大容量的文件讀取 |
原理: 加載一點,讀取一點,處理一點。適合大容量文件的讀取 |
DOM解析可以任意進行增刪改成 |
SAX解析只能讀取 |
DOM解析任意讀取任何位置的數據,甚至往回讀 |
SAX解析只能從上往下,按順序讀取,不能往回讀 |
DOM解析面向對象的編程方法(Node,Element,Attribute),Java開發者編碼比較簡單。 |
SAX解析基於事件的編程方法。java開發編碼相對複雜。 |
總結:
1)Dom4j修改xml文檔
new XMLWrier();
......
2)xPath技術: 快速查詢xml節點
selectNodes()
selectSinglNode();
xpath表達式語言
3) SAX解析
SAXParser parse
parser()
DefaultHandler類:
startElement();
characters();
endElement();