java自带的xml解析_Java自带的XML解析
JAXP(Java API for XML Processing,意為處理XML的Java API)
解析XML一般有兩種方式:
一種是DOM方式:一次性讀取XML內容存入內存
優點:能進行各種增刪改查的操作
確定:占用內存大
使用:給定需要讀取的文件即可讀取,讀取出來之后再根據自己寫的方法進行操作
還有一種是SAX方式:順序讀取內容,碰到什么樣的標簽執行什么樣的操作由自己定義
優點:占用內存小
缺點:不能進行各種增刪改查操作,只能遍歷出內容
使用:給定需要讀取的文件和一個操作集,操作集會指示在遍歷的時候遇到什么凍死做什么事
對xml進行操作就是操作xml文件當中的元素和屬性:文本內容>
由于元素里面的文本內容可以是子元素,而為了閱讀方便通常都是換行另起一行并縮進的,造成了父元素和子元素之間有兩段空格和一個換行,解析xml文檔的時候識別不了,所以也會一并讀取出來
舉例:
XML文件:students.xml
tom
20
male
jerry
19
female
DOM方式實現類:DomDemo.java
package com.jyh.xml.parser;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomDemo {
public static void main(String[] args) {
//1.獲取jaxp工廠
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
//2.獲取解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//3.用解析器加載xml文檔--->Document
Document document = builder.parse(new File("src/students.xml"));
//4.獲得所有學生集合
NodeList studentList = document.getElementsByTagName("student");
//5.遍歷學生集合
for(int i = 0; i < studentList.getLength(); i ++){
//通過下標獲得各個學生
Element stuElm = (Element)studentList.item(i);
//獲取每個學生的學號屬性
String number = stuElm.getAttribute("number");
System.out.println("學號:" + number);
//獲取每個學生下的所有子節點(包括空白)
NodeList childrenList = stuElm.getChildNodes();
//便利子節點集合獲取元素
int length = childrenList.getLength();
for(int j = 0; j < length; j ++){
Node node = childrenList.item(j);
//判斷子節點是不是element元素類型(因為遍歷過程中會遍歷出空格和換行)
if(node.getNodeType() == Node.ELEMENT_NODE){
Element child = (Element) node;
switch (child.getNodeName()) {
case "name":
String name = child.getTextContent();
System.out.println("姓名:" + name);
break;
case "age":
String age = child.getTextContent();
System.out.println("年齡:" + age);
break;
case "sex":
String sex = child.getTextContent();
System.out.println("性別:" + sex);
break;
default:
break;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
這種方式就是對樹進行操作,開始根據根元素名獲取根元素集合:
NodeList studentList = document.getElementsByTagName("student");
然后遍歷根集合獲得每個根元素,由于有了根元素,所以可以根據根節點獲取下面的子元素:
NodeList childrenList = stuElm.getChildNodes();
獲得屬性就用方法
String number = stuElm.getAttribute("number");
輸出結果:
學號:jyh_0001
姓名:tom
年齡:20
性別:male
學號:jyh_0002
姓名:jerry
年齡:19
性別:female
SAX方式實現類:SaxDemo.java和MyHandle.java
SaxDemo.java:
package com.jyh.xml.parser;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SaxDemo {
public static void main(String[] args) {
//1.獲得解析器工廠
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.獲得解析器
try {
SAXParser parser = factory.newSAXParser();
//3.解析文檔(告訴去讀取哪個文檔,讀取文檔過程中遇到什么情況該怎么處理)
//第一個參數代表要解析的文檔,第二個參數代表解析文檔過程中遇到什么樣的情況該怎么做
parser.parse(new File("src/students.xml"), new MyHandle());
} catch (Exception e) {
e.printStackTrace();
}
}
}
MyHandle.java:
package com.jyh.xml.parser;
import org.xml.sax.helpers.DefaultHandler;
public class MyHandle extends DefaultHandler{
//文檔開始解析
@Override
public void startDocument() throws org.xml.sax.SAXException {
System.out.println("文檔開始解析");
}
/*遇到元素開始解析
* 參數3是讀取到的元素名稱,參數4是讀取到的元素的屬性集
*/
@Override
public void startElement(String uri, String localName, String qName,
org.xml.sax.Attributes attributes) throws org.xml.sax.SAXException {
System.out.println(qName + "元素開始解析");
//判斷遇到的是不是學生元素
if(qName.equals("student")){
//如果是則獲取該元素的屬性
String number = attributes.getValue("number");
System.out.println("學號:" + number);
}
}
//遇到文本開始解析
@Override
public void characters(char[] ch, int start, int length)
throws org.xml.sax.SAXException {
String str = new String(ch,start,length);
str = str.trim();
if(str.length() > 0){
System.out.println(str);
}
}
//元素解析結束
@Override
public void endElement(String uri, String localName, String qName)
throws org.xml.sax.SAXException {
System.out.println(qName + "元素解析結束");
}
//文檔結束觸發
@Override
public void endDocument() throws org.xml.sax.SAXException {
System.out.println("文檔解析結束");
}
}
MyHandle里有五個方法:
startDocument();-->開始解析文檔
startElement(String uri, String localName, String qName,org.xml.sax.Attributes attributes);-->碰到元素開始符則開始解析元素
String number = attributes.getValue("number");-->獲取元素的屬性
characters(char[] ch, int start, int length);-->碰到文本開始解析文本
endElement();-->碰到元素結束符,結束元素解析
endDocument(String uri, String localName, String qName);-->結束解析文檔
輸出結果(優化之后):
文檔開始解析
students元素開始解析
student元素開始解析
學號:jyh_0001
name元素開始解析
tom
name元素解析結束
age元素開始解析
20
age元素解析結束
sex元素開始解析
male
sex元素解析結束
student元素解析結束
student元素開始解析
學號:jyh_0002
name元素開始解析
jerry
name元素解析結束
age元素開始解析
19
age元素解析結束
sex元素開始解析
female
sex元素解析結束
student元素解析結束
students元素解析結束
文檔解析結束
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的java自带的xml解析_Java自带的XML解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java reference详解_Jav
- 下一篇: php取消mysql警告_mysql登录