-
常用的節(jié)點(diǎn)類型
查看全部 -
四種解析xml文件的方式:DOM、SAX、DOM4J、JDOM
查看全部 -
xml的作用
查看全部 -
books.xml實(shí)例
查看全部 -
xml結(jié)構(gòu)簡介
查看全部 -
常用的節(jié)點(diǎn)類型
查看全部 -
xml文件解析sax>dom>dom4j>jdom
查看全部 -
SAX解析XML的速度比DOM的塊,
SAX的解析XML的解析器,需要重寫startElement()開始解析的方法and endElemaent()方法 結(jié)束解析的方法and characters()方法
重寫charaters()方法時(shí),String(byte[] bytes,int offset,int length)的構(gòu)造方法進(jìn)行數(shù)組的傳遞
再去除解析時(shí)多余空格
if(!value.trim().equals("")){
System.out.println(value);
}
使用 SAX 解析 XML 文件的節(jié)點(diǎn)名和節(jié)點(diǎn)間文本
startElement方法——String qName(第三個(gè)參數(shù)):節(jié)點(diǎn)名
startElement方法——Attributes attributes(第四個(gè)參數(shù)):節(jié)點(diǎn)名的屬性操作
characters方法——char[] ch(第一個(gè)參數(shù)):xml整個(gè)文本內(nèi)容,所以需截取想要的內(nèi)容
如圖代碼+以下代碼
public void endElement(String uri, String localName, String qName)
throws SAXException {
//調(diào)用DefaultHandler類的endElement方法
super.endElement(uri, localName, qName);
//判斷是否針對(duì)一本書已經(jīng)遍歷結(jié)束
if (qName.equals("book")) {
System.out.println("======================結(jié)束遍歷某一本書的內(nèi)容=================");
}
}
characters(char[] ch, int start, int length) 方法總結(jié):
簡單來說解析器首先在startDocument之后會(huì)讀取XML中的字符串(從根節(jié)點(diǎn)開始一直到根節(jié)點(diǎn)結(jié)束)并放入ch[]字符數(shù)組中去,然后在解析到#TEXT節(jié)點(diǎn)(包括空格和換行符)時(shí)使用start來標(biāo)記字符在ch[]數(shù)組中的起始位置,length標(biāo)記長度,然后調(diào)用character方法,character方法默認(rèn)不會(huì)進(jìn)行任何處理,想進(jìn)行處理需要重寫方法。
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("節(jié)點(diǎn)值是:" + value);
}
}查看全部 -
獲取xml的標(biāo)簽
開始:startElement(String uri, String localName, String qName,Attributes attributes)
獲取屬性名:attributes.getQName(i);獲取屬性值:attributes.getValue(i)
結(jié)束:endElement(String uri, String localName, String qName)
解析xml元素(重寫startElement()方法)
1. 調(diào)用DefaultHanlder 的startElement()方法
super.startElement(uri,localName,qName,attributes);
2. 開始解析book元素屬性
/**
* 解析xml元素
*/
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 調(diào)用父類(DefaultHandler)的startElement方法
super.startElement(uri, localName, qName, attributes);
// 開始解析book元素的屬性
if (qName.equals("book")) {
// //已知book元素下屬性的名稱,根據(jù)屬性名稱獲取屬性值
// String value = attributes.getValue("id");
// System.out.println("book的屬性值是:" + value);
// 不知道book元素下屬性的名稱以及個(gè)數(shù),如何獲取屬性名以及屬性值
int num = attributes.getLength();
for (int i = 0; i < num; i++) {
System.out.print("book元素的第" + (i + 1) + "個(gè)屬性名是:"
+ attributes.getQName(i));
System.out.println("---屬性值是:" + attributes.getValue(i));
}
}
}查看全部 -
SAX方式解析xml步驟
1.通過SAXParserFactory的靜態(tài)newInstance()方法獲取一個(gè)SAXParserFactory的對(duì)象。SAXParserFactory factory = SAXParserFactory.newInstance();
2.通過SAXParserFactory對(duì)象的newSAXParser()方法返回一個(gè)SAXParser類的對(duì)象。
SAXParser parser = factory.newSAXParser();
3.創(chuàng)建一個(gè)類繼承DefaultHandler,重寫其中的一些方法并創(chuàng)建類的實(shí)例.
類SAXParserHandler implements DefaultHandler;
4.通過SAXParser類的Parse(Stringname,df)方法解析xml文件,參數(shù)Stringname為路徑名,df為繼承于DefaultHandler類的實(shí)例化對(duì)象,不需要定義變量存儲(chǔ)返回的類型.
SAX是按節(jié)點(diǎn)順序進(jìn)行解析,遇到xml的聲明即開始解析,遇到最后一個(gè)節(jié)點(diǎn)的尾節(jié)點(diǎn)便結(jié)束解析,需要用戶自己定義一個(gè)類繼承于DefaultHandler類來解析,遇到開始標(biāo)簽節(jié)點(diǎn)便通過startElement開始解析節(jié)點(diǎn),遇到結(jié)束標(biāo)簽節(jié)點(diǎn)便通過endElement結(jié)束解析,再遇到開始節(jié)點(diǎn)繼續(xù)通過startElement解析,一直循環(huán)直到xml文件最后的結(jié)束標(biāo)簽節(jié)點(diǎn).
5.在繼承于DefaultHandler這個(gè)類中需要重寫父類的startElement()和endElement()方法,來進(jìn)行開始節(jié)點(diǎn)與結(jié)束節(jié)點(diǎn)的解析,再重寫startDocument()方法與endDocument()方法來標(biāo)識(shí)解析的開始與結(jié)束.
public class SAXParserHandler extends DefaultHandler {
/**
* 用來標(biāo)識(shí)解析開始
*/
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("SAX解析開始");
}
/**
* 解析xml元素節(jié)點(diǎn)開始
*/
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
System.out.println("解析xml元素開始");
}
/**
* 處理文本內(nèi)容(獲取的是整個(gè)XML文本內(nèi)容)
*/
public void characters(char[] ch, int start, int length)
throws SAXException {
super.characters(ch, start, length);
System.out.println("文本處理中...");
}
/* 解析xml元素節(jié)點(diǎn)結(jié)束
*/
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
System.out.println("解析xml元素結(jié)束");
}
/**
* 用來標(biāo)識(shí)解析結(jié)束
*/
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("SAX解析結(jié)束");
}6.創(chuàng)建SAXParserHandler對(duì)象
??????? SAXParserHandler handler = new SAXParserHandler()
7.調(diào)用parse(url,handler實(shí)例)方法
??????? parser.parse("book.xml",handler);查看全部 -
解析文件節(jié)點(diǎn)以及子節(jié)點(diǎn)的值
1.先獲取子節(jié)點(diǎn),Node下有方法getChildNodes()來獲取某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)的集合,返回NodeList類型.
NodeList childNodes=book.getChildNodes()//包含book節(jié)點(diǎn)所有的子節(jié)點(diǎn),兩個(gè)標(biāo)簽之間的所有內(nèi)容都看成是子節(jié)點(diǎn).
2.通過childNodes的getLength()方法返回字點(diǎn)的個(gè)數(shù)(空格與換行字符看成為一個(gè)文本節(jié)點(diǎn),標(biāo)簽與結(jié)束標(biāo)簽看成一個(gè)元素節(jié)點(diǎn))
3.通過NodeList的item(i)獲取指定位置子節(jié)點(diǎn)的名稱返回Node類型.再用Node類型的getNodeName()方法就可以獲取節(jié)點(diǎn)名
Node childnode=childNodes.item(i);
String name=childnode.getNodeName();
可以通過Node類的getNodeType()來區(qū)分文本類型的node以及元素類型的node,看當(dāng)前Node類型是否與Node."節(jié)點(diǎn)類型英文全稱"相同.
if(childnode.getNodeType==Node.ELEMENT_NODE)
{System.out.println(name)}
4.不能直接通過Node的getNodeValue()來獲取節(jié)點(diǎn)的值,因?yàn)樵毓?jié)點(diǎn)的nodeValue的返回值為null而且標(biāo)簽之間的文本被看做是該標(biāo)簽的子節(jié)點(diǎn).所以要用Node的getFirstChild()此時(shí)獲取的子節(jié)點(diǎn)為文本節(jié)點(diǎn),Text節(jié)點(diǎn)類型的nodeValue返回值為節(jié)點(diǎn)內(nèi)容,再getNodeValue()。
或者直接用Node的getTextContent()方法直接獲取節(jié)點(diǎn)值。
如果該Node節(jié)點(diǎn)還存在其他子節(jié)點(diǎn)并且有節(jié)點(diǎn)值<name><a>呵呵呵</a>華以及咯</name>,那么用getFirstChild().getNodeValue()一樣是null,因?yàn)楂@取的子節(jié)點(diǎn)仍然是element類型的
如果用Node的getTextContent(),一樣會(huì)把<a>元素節(jié)點(diǎn)當(dāng)成是Content輸出。 結(jié)果為呵呵呵華以及咯。查看全部 -
document.getElementByTagName(),獲取標(biāo)簽集合<br>
2.node.getAttribute(),獲取屬性集合(應(yīng)該是一個(gè)Map集合)<br>
3.NodeList集合(標(biāo)簽集合) NameNodeMap集合(屬性集合)<br>1.獲取book節(jié)點(diǎn)的子節(jié)點(diǎn)。NodeList childNodes =book.getChildNodes();<br>
2.獲取book下子節(jié)點(diǎn)的節(jié)點(diǎn)內(nèi)容的兩種方式:<br>
1)childNodes.item(index).getFirstChild().getNodeValue();<br>
2)childNodes.item(index).getTextContent();<br>
第一種方式在其下面還有子節(jié)點(diǎn)時(shí),會(huì)因?yàn)槭荅lement節(jié)點(diǎn)所以默認(rèn)的getNodeValue()返回值是null;<br>
第二章方式在其下面還有子節(jié)點(diǎn)時(shí),會(huì)將子節(jié)點(diǎn)內(nèi)容與當(dāng)前節(jié)點(diǎn)內(nèi)容一起獲取。
注:在獲取當(dāng)前節(jié)點(diǎn)的子節(jié)點(diǎn)時(shí),當(dāng)前節(jié)點(diǎn)下的空格與回車符會(huì)被當(dāng)做Text類型的子節(jié)點(diǎn)獲取(#Test)。查看全部 -
使用Dom解析xml文件的屬性節(jié)點(diǎn)。
在不知道節(jié)點(diǎn)屬性的個(gè)數(shù)和屬性名時(shí):
1、通過document.getElementByTagName("標(biāo)簽名")獲得所有標(biāo)簽名的節(jié)點(diǎn),得到一個(gè)NodeList集合
2、通過NodeList.getLength()獲得集合長度,遍歷集合
3、Node node = NodeList.item(index)獲得里面的節(jié)點(diǎn)
4、通過NamedNodeMap attrs = node.getAttributes()獲取所有屬性集合
5、通過attrs.getLength()遍歷集合,Node attr = atrrs.item(index)
6、attr.getNodeName()獲得屬性名,attr.getNodeValue()獲取屬性值
前提已經(jīng)知道book節(jié)點(diǎn)有且只有1個(gè)id屬性,將book節(jié)點(diǎn)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,轉(zhuǎn)換成element類型。
1、通過document.getElementByTagName("標(biāo)簽名")獲得所有標(biāo)簽名的節(jié)點(diǎn),得到一個(gè)NodeList集合
2、通過NodeList.getLength()獲得集合長度,遍歷集合
3、element book=(element)bookList.item(i);//強(qiáng)制轉(zhuǎn)換為element類型
4、string attrValue = book.getAttribute("id");DOM 方式解析 XML
? DocumentBuilder db =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
? // 通過DocumentBuilder對(duì)象的parse方法加載books.xml文件到當(dāng)前項(xiàng)目下
? Document document = db.parse("books.xml");
? // 通過標(biāo)簽名獲取節(jié)點(diǎn)集合,? 獲取所有book節(jié)點(diǎn)的集合
? NodeList bookList = document.getElementsByTagName("book");?
? // 遍歷每一個(gè)book節(jié)點(diǎn)
? for(int i = 0; i < bookList.getLength(); i ++){
?????? // 通過 item(i) 方法 獲取 一個(gè)book節(jié)點(diǎn),nodeList的索引值從 0 開始
?????? Node book = bookList.item(i);
?????? // 獲取 book 節(jié)點(diǎn)的所有屬性的集合
?????? NameNodeMap attrs = book.getAttributes();
?????? // 遍歷 book 的屬性
?????? for(int j = 0; j < attrs.getLength(); j ++){
?????????? // 通過 item(index) 方法獲取 book 節(jié)點(diǎn)的某一屬性
?????????? Node attr = attrs.item(j);?
????????? // 獲得屬性名稱
?????????? System.out.print("屬性名:" + attr.getNodeName());
?????????? System.out.println("---屬性值:" + attr.getNodeValue());
?????? }
? }查看全部 -
獲取xml文件內(nèi)容的
四種解析方式:DOM SAX DOM4J JDOM
DOM、SAX :java 官方方式,不需要下載jar包
DOM4J、JDOM :第三方,需要網(wǎng)上下載jar包
DOM使用步驟:
準(zhǔn)備工作
1、創(chuàng)建一個(gè)DocumentBuilderFactory的對(duì)象
DocumentBuilderFactory dbf = DocumnetBuilderFactory.instance();
2、創(chuàng)建一個(gè)DocumentBuilder的對(duì)象
DocumentBuilder db = dbf.newDocumentBuilder();
3、通過DocumentBuilder對(duì)象的parse方法加載xml文件到當(dāng)前項(xiàng)目
Document document = db.parse("*.xml");查看全部 -
不同系統(tǒng)間通信、不同軟件間通信、不同平臺(tái)間通信使用xml文件
XML文件用來存儲(chǔ)數(shù)據(jù)和傳輸數(shù)據(jù)
XML存儲(chǔ)結(jié)構(gòu)為樹狀
xml聲明:<?xml version="1.0"encoding="utf-8"? >
XML作用:
不同應(yīng)用程序之間通信、傳輸信息(訂票程序和支付程序)
不同系統(tǒng)間的通信(例:Windows系統(tǒng)和IOS系統(tǒng))
不同平臺(tái)間的數(shù)據(jù)共享(手機(jī)端和PC端)
不同APP之間的通信,不同的平臺(tái)間的通信,不同平臺(tái)間的數(shù)據(jù)共享。XML文件主要用于存儲(chǔ)以及傳輸信息。
通過xml文件存儲(chǔ)小型數(shù)據(jù)。查看全部
舉報(bào)