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