讀取xml文件

今天項目中,用到了遍歷讀取項目一個目錄下的.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標籤

 HTMLXML的區別

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> 空標籤。沒有標籤體內容

2xml標籤名稱區分大小寫。

3xml標籤一定要正確配對。

4xml標籤名中間不能使用空格

5xml標籤名不能以數字開頭

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解析原理:

1JAXP oracle-Sun公司官方)

2JDOM工具(非官方)

3Dom4J工具(非官方)

三大框架(默認讀取xml的工具就是Dom4j

.......

 SAX解析原理:

1Sax解析工具(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("標籤名") //獲取當前標籤的指定名稱的子標籤的文本內容

總結:

1XML的作用

 配置文件(最常見)

 作爲數據庫

2XML語法

3XML解析(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文件對象

parseFile f,DefaultHandler dh)方法:解析xml文件

參數一: File:表示 讀取的xml文件。

    參數二: DefaultHandlerSAX事件處理程序。使用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解析面向對象的編程方法(NodeElementAttribute,Java開發者編碼比較簡單。

SAX解析基於事件的編程方法。java開發編碼相對複雜。

 總結:

1Dom4j修改xml文檔

 new XMLWrier();

......

2xPath技術: 快速查詢xml節點

selectNodes()

selectSinglNode();

xpath表達式語言

3)  SAX解析

SAXParser parse

parser()

DefaultHandler類:

startElement();

characters();

endElement();

發佈了19 篇原創文章 · 獲贊 19 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章