本文目錄一覽:
- 1、java XML解析詳解
- 2、如何用java封裝解析一個多層次的XML文件,急求大神幫助
- 3、java的xml的解析方式有什麼,他們的解析流程是怎麼樣的,有什麼區別
- 4、請問誰知道Java中如何解析XML文件?
- 5、java解析嵌套xml??
java XML解析詳解
(I)Java通過DOM解析XML
1得到DOM解析器的工廠實例
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
得到javax.xml.parsers.DocumentBuilderFactory;類的實例就是我們要的解析器工廠
2從DOM工廠獲得DOM解析器
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
通過javax.xml.parsers.DocumentBuilderFactory實例的靜態方法newDocumentBuilder()得到DOM解析器
3把要解析的XML文檔轉化為輸入流,以便DOM解析器解析它
InputStream is=new FileInputStream(“bin/library.xml”);
InputStream是一個介面。
4解析XML文檔的輸入流,得到一個Document
Document doc=dombuilder.parse(is);
由XML文檔的輸入流得到一個org.w3c.dom.Document對象,以後的處理都是對Document對象進行的
5得到XML文檔的根節點
Element root=doc.getDocumentElement();
在DOM中只有根節點是一個org.w3c.dom.Element對象。
6得到節點的子節點
NodeList books=root.getChildNodes();
for(int i=0;ibooks.getLength();i++){
Node book=books.item(i);
}
這是用一個org.w3c.dom.NodeList介面來存放它所有子節點的,還有一種輪循子節點的方法,後面有介紹
7取得節點的屬性值
String email=book.getAttributes().getNamedItem(“email”).getNodeValue();
System.out.println(email);
注意,節點的屬性也是它的子節點。它的節點類型也是Node.ELEMENT_NODE
8輪循子節點
for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){
if(node.getNodeType()==Node.ELEMENT_NODE){
if(node.getNodeName().equals(“name”)){
String name=node.getNodeValue();
String name1=node.getFirstChild().getNodeValue();
…
if(node.getNodeName().equals(“price”)){
String price=node.getFirstChild().getNodeValue();
…
Java通過SAX解析XML
Simple API for XML(簡稱SAX)是個循序存取XML的解析器API。
一個實現SAX的解析器(也就是「SAX Parser」)以一個串流解析器的型式作用,擁有事件驅動API。由使用者定義回調函數,解析時,若發生事件的話會被調用。SAX事件包括:
XML 文字 節點
XML 元素 節點
XML 處理指令
XML 注釋
Java代碼
person
user
username謝成志/username
password6626310xie/password
sex男/sex
birthday1988/11/28/birthday
headpic
pictitleermao/pictitle
picurlimages/head1.jpg/picurl
/headpic
/user
/person
此為下面即將解析度簡單xml結構,並將其封裝成一個User對象。
////////////////////////////////////////////////////////////////////////////////////
Java代碼
span style=”font-family: courier new,courier; font-size: small;”package com.xcz.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.xcz.util.SaxUtil;
public class Sax4XML {
public static void main(String[] args) {
try {
//1.獲取factory
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.獲取parser
SAXParser parser = factory.newSAXParser();
//3.獲取解析時的監聽器對象
SaxUtil su = new SaxUtil();
//4.開始解析
parser.parse(new File(“src/user-params.xml”), su);
System.out.println(su.getUser());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/span
////////////////////////////////////////////////////////////////////////////////////
Java代碼
span style=”font-family: courier new,courier; font-size: small;”package com.xcz.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.xcz.po.HeadPic;
import com.xcz.po.User;
/**
* 定義xml解析時的監聽類
*
* 實現方式有很多,可以實現介面:ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler
* 但我們常用的繼承:DefaultHandler
*/
public class SaxUtil extends DefaultHandler {
private User user;
private HeadPic headPic;
private String content;
private SimpleDateFormat sdf = new SimpleDateFormat(“yyyy/MM/dd”);
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
content = new String(ch, start, length);
}
//當解析到文本開始時觸發
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
//當解析到文本結束時觸發
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
//當解析到元素開始時觸發
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException
{
if(“user”.equals(name))
{
user = new User();
}
if(“headpic”.equals(name))
{
headPic = new HeadPic();
}
}
//當解析到元素結束時觸發
@Override
public void endElement(String uri, String localName, String name)
throws SAXException
{
if(“username”.equals(name))
{
user.setUsername(content);
}
if(“password”.equals(name))
{
user.setPassword(content);
}
if(“sex”.equals(name))
{
user.setSex(content);
}
if(“birthday”.equals(name))
{
try {
user.setBirthday(sdf.parse(content));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(“pictitle”.equals(name))
{
headPic.setPicTitle(content);
}
if(“picurl”.equals(name))
{
headPic.setPicUrl(content);
user.setHeadPic(headPic);
}
}
public User getUser(){
return user;
}
}/span
[優點]
(1).節約內存開銷
SAX解析器在某些方面優於DOM風格解析器,因為SAX解析器的內存使用量一般遠低於DOM解析器使用量。DOM解析器在任何處理開始之前,必須將xml以整棵樹放在內存,所以DOM解析器的內存使用量完全根據輸入資料的大小。相對來說,SAX解析器的內存內容,是只基於XML檔案的最大深度(XML樹的最大深度)和單一XML項目上XML屬性儲存的最大資料。
(2)解析速度快
因為SAX事件驅動的本質,處理文件通常會比DOM風格的解析器快。
[缺點]
SAX事件驅動的模型對於XML解析很有用,但它確實有某些缺點。
某些種類的XML驗證需要存取整份文件。例如,一個DTD IDREF屬性需要文件內有項目使用指定字串當成DTD ID屬性。要在SAX解析器內驗證,必須追蹤每個之前遇過的ID和IDREF屬性,檢查是否有任何相符。更甚者,一個IDREF找不到對應的ID,使用者只會在整份文件都解析完後才發現,若這種連結對於建立有效輸出是重要的,那用在處理整份文件的時間只是浪費。
如何用java封裝解析一個多層次的XML文件,急求大神幫助
下面提供了XML解析成實體類,以及實體類轉換成xml的方法。
public class SwitchXML {
private XStream xStream = new XStream();
private String xmlPath = “D:/data.xml”;
// 1. obj – xml(object類型轉換為xml類型)
public String printXML(User user) {
System.out.println(“obj – xml”);
String xml = xStream.toXML(user);
System.out.println(xml);
return xml;
}
// 2. xml-obj(xml類型轉換為object類型,並列印)
public void printObj(String xml) {
System.out.println(“xml – obj”);
User u = (User) xStream.fromXML(xml);
System.out.println(u.getUserName() + ” ” + u.getPassWord() + ” ” + u.getRegisteredTime());
}
// 3. 將object類型轉換為xml類型,並寫入XML文件(其他格式也可以,比如txt文件)
public void writerXML(User user) {
try {
FileOutputStream fs = new FileOutputStream(xmlPath);
xStream.toXML(user, fs);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
// 4. 讀取XML文件,載入進相應Object類型
public void readerXML() {
User user = new User();
FileInputStream fis = null;
try {
fis = new FileInputStream(xmlPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
xStream.fromXML(fis, user);
// 列印對象信息
System.out.println(user.toString());
// 列印對象的屬性值
System.out.println(user.getUserName() + “-” + user.getPassWord() + “-“
+ user.getRegisteredTime());
}
public static void main(String[] args) {
// 用戶名
String username = “admin”;
// 密碼
String password = “admin”;
// 註冊時間
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat(“yyyyMMddHHmmss”);
String registeredtime = format.format(now);
User user = new User(username, password, registeredtime);
SwitchXML switchXML = new SwitchXML();
// 1. object類型轉換為xml類型,在控制台列印
String xml = switchXML.printXML(user);
System.out.println(“———————“);
// 2. xml類型轉換為object類型,在控制台列印
switchXML.printObj(xml);
System.out.println(“———————“);
// 3. 將object類型轉換為xml類型,並寫入XML文件
switchXML.writerXML(user);
System.out.println(“———————“);
// 4. 讀取XML文件,載入進相應Object類型
switchXML.readerXML();
}
java的xml的解析方式有什麼,他們的解析流程是怎麼樣的,有什麼區別
答:4種。(或者說是兩種,因為JDOM和DOM4J是DOM的兩個特殊情況)
1.SAX解析
解析方式是事件驅動機制!
SAX解析器,逐行讀取XML文件解析,每當解析到一個標籤的開始/結束/內容/屬性時,觸發事件。
可以在這些事件發生時,編寫程序進行相應的處理。
優點:
分析能夠立即開始,而不是等待所有的數據被處理。
逐行載入,節省內存,有助於解析大於系統內存的文檔。
有時不必解析整個文檔,它可以在某個條件得到滿足時停止解析。
缺點:
1.單向解析,無法定位文檔層次,無法同時訪問同一個文檔的不同部分數據(因為逐行解析,當解析第n行時,第n-1行)已經被釋放了,無法再對其進行操作)。
2. 無法得知事件發生時元素的層次, 只能自己維護節點的父/子關係。
3. 只讀解析方式, 無法修改XML文檔的內容。
2. DOM解析
是用與平台和語言無關的方式表示XML文檔的官方W3C標準,分析該結構通常需要載入整個 文檔和內存中建立文檔樹模型。程序員可以通過操作文檔樹, 來完成數據的獲取 修改 刪除等。
優點:
文檔在內存中載入, 允許對數據和結構做出更改。訪問是雙向的,可以在任何時候在樹中雙向解析數據。
缺點:
文檔全部載入在內存中 , 消耗資源大。
3. JDOM解析
目的是成為Java特定文檔模型,它簡化與XML的交互並且比使用DOM實現更快。由於是第一 個Java特定模型,JDOM一直得到大力推廣和促進。
JDOM文檔聲明其目的是「使用20%(或更少)的精力解決80%(或更多)Java/XML問題」 (根據學習曲線假定為20%)
優點:
使用具體類而不是介面,簡化了DOM的API。
大量使用了Java集合類,方便了Java開發人員。
缺點:
沒有較好的靈活性。
性能不是那麼優異。
4. DOM4J解析
它是JDOM的一種智能分支。它合併了許多超出基本XML文檔表示的功能,包括集成的XPath 支持、XML Schema支持以及用於大文檔或流化文檔的基於事件的處理。它還提供了構建文檔表示的選項, DOM4J是一個非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一 個開放源代碼的軟體。如今你可以看到越來越多的Java軟體都在使用DOM4J來讀寫XML。
目前許多開源項目中大量採用DOM4J , 例如:Hibernate。
請問誰知道Java中如何解析XML文件?
解析一個XML文件有四種方式:DOM 、JDOM、SAX 、DOM4J 。我以DOM解析方式來簡單說明下。
首先,我們先導入所需要的包:
import javax.xml.DocumentBuilderFactory; //用來創建解析器工廠
import javax.xml.DocumentBuilder; //解析器對象
import org.w3c.dom.Document; //Document類實現了W3C組織定義的介面規範。
import org.w3c.dom.NodeList; //節點列表類要導入的包,它也是W3C組織下的類。
DocumentBuilderFactory類是一個抽象類,不能直接實例化,但該類提供了一個newInstance方法,我們使用該方法先獲得一個新的實例對象factory:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
接著,我們從解析器工廠獲取解析器對象:
DocumentBuilder builder = factory.newDocumentBuilder();
這時,可以調用DocumentBuilder對象的parse方法,它會返回一個新的DOM文檔對象:
Document doc = builder.parse(「」);
這裡parse方法將給定的URI的內容當作XML文檔來分析,最後形成一個樹狀對象集合。這樣我們就可以使用doc對象來獲取文檔中的內容了。如:
NodeList list = doc.getElementsByTagName(「title」);
getElementsByTagName方法可以根據標籤名獲取元素節點集合。調用該方法並傳入標籤名「title」作為參數,能獲取到所有「title」元素的集合。
用DOM解析XML大體步驟如上,如果你還有不明白的,可以上秒秒學了解下。
java解析嵌套xml??
NodeList origNodeList = doc.getElementsByTagName(“orig”);
NodeList emNodeList = doc.getElementsByTagName(“em”);
//刪除em標籤中的內容
origNodeList.item(0).removeChild(emNodeList.item(0));
//輸出要求的句子
System.out.println(origNodeList.item(0).getTextContent());
原創文章,作者:CSUME,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/313407.html