Ⅰ java解析xml常用的幾種方式、
1.DOM(Document Object Model) DOM是用與平台和語言無關的方式表示XML文檔的官方W3C標准。DOM是以層次結構組織的節點或信息片斷的集...
2.SAX(Simple API for XML) SAX處理的優點非常類似於流媒體...
3.JDOM(Java-based Document Object Model)
Ⅱ java解析xml的幾種方式哪種最好
(1)DOM解析
DOM是html和xml的應用程序介面(API),以層次結構(類似於樹型)來組織節點和信息片段,映射XML文檔的結構,允許獲取
和操作文檔的任意部分,是W3C的官方標准
【優點】
①允許應用程序對數據和結構做出更改。
②訪問是雙向的,可以在任何時候在樹中上下導航,獲取和操作任意部分的數據。
【缺點】
①通常需要載入整個XML文檔來構造層次結構,消耗資源大。
【解析詳解】
①構建Document對象:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = bdf.newDocumentBuilder();
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(xml文件);
Document doc = bd.parse(is);
②遍歷DOM對象
Document: XML文檔對象,由解析器獲取
NodeList: 節點數組
Node: 節點(包括element、#text)
Element: 元素,可用於獲取屬性參數
(2)SAX(Simple API for XML)解析
流模型中的"推"模型分析方式。通過事件驅動,每發現一個節點就引發一個事件,事件推給事件處理器,通過回調方法
完成解析工作,解析XML文檔的邏輯需要應用程序完成
【優勢】
①不需要等待所有數據都被處理,分析就能立即開始。
②只在讀取數據時檢查數據,不需要保存在內存中。
③可以在某個條件得到滿足時停止解析,不必解析整個文檔。
④效率和性能較高,能解析大於系統內存的文檔。
【缺點】
①需要應用程序自己負責TAG的處理邏輯(例如維護父/子關系等),文檔越復雜程序就越復雜。
②單向導航,無法定位文檔層次,很難同時訪問同一文檔的不同部分數據,不支持XPath。
【原理】
簡單的說就是對文檔進行順序掃描,當掃描到文檔(document)開始與結束、元素(element)開始與結束時通知事件
處理函數(回調函數),進行相應處理,直到文檔結束
【事件處理器類型】
①訪問XML DTD:DTDHandler
②低級訪問解析錯誤:ErrorHandler
③訪問文檔內容:ContextHandler
【DefaultHandler類】
SAX事件處理程序的默認基類,實現了DTDHandler、ErrorHandler、ContextHandler和EntityResolver介面,通常
做法是,繼承該基類,重寫需要的方法,如startDocument()
【創建SAX解析器】
SAXParserFactory saxf = SAXParserFactory.newInstance();
SAXParser sax = saxf.newSAXParser();
註:關於遍歷
①深度優先遍歷(Depthi-First Traserval)
②廣度優先遍歷(Width-First Traserval)
(3)JDOM(Java-based Document Object Model)
Java特定的文檔對象模型。自身不包含解析器,使用SAX
【優點】
①使用具體類而不是介面,簡化了DOM的API。
②大量使用了Java集合類,方便了Java開發人員。
【缺點】
①沒有較好的靈活性。
②性能較差。
(4)DOM4J(Document Object Model for Java)
簡單易用,採用Java集合框架,並完全支持DOM、SAX和JAXP
【優點】
①大量使用了Java集合類,方便Java開發人員,同時提供一些提高性能的替代方法。
②支持XPath。
③有很好的性能。
【缺點】
①大量使用了介面,API較為復雜。
(5)StAX(Streaming API for XML)
流模型中的拉模型分析方式。提供基於指針和基於迭代器兩種方式的支持,JDK1.6新特性
【和推式解析相比的優點】
①在拉式解析中,事件是由解析應用產生的,因此拉式解析中向客戶端提供的是解析規則,而不是解析器。
②同推式解析相比,拉式解析的代碼更簡單,而且不用那麼多庫。
③拉式解析客戶端能夠一次讀取多個XML文件。
④拉式解析允許你過濾XML文件和跳過解析事件。
【簡介】
StAX API的實現是使用了Java Web服務開發(JWSDP)1.6,並結合了Sun Java流式XML分析器(SJSXP)-它位於
javax.xml.stream包中。XMLStreamReader介面用於分析一個XML文檔,而XMLStreamWriter介面用於生成一個
XML文檔。XMLEventReader負責使用一個對象事件迭代子分析XML事件-這與XMLStreamReader所使用的游標機制
形成對照。
Ⅲ java解析xml文件
給個例子你
<?xmlversion="1.0"encoding="utf-8"?>
<Accounts>
<Accounttype="type1">
<code>100001</code>
<pass>123</pass>
<name>李四</name>
<money>1000000.00</money>
</Account>
<Accounttype="type2">
<code>100002</code>
<pass>123</pass>
<name>張三</name>
<money>1000.00</money>
</Account>
</Accounts>
java代碼:
importjava.io.*;
/**
*xml文件解析
*@authoryoung
*
*/
importjavax.xml.parsers.DocumentBuilder;
importjavax.xml.parsers.DocumentBuilderFactory;
importorg.w3c.dom.Document;
importorg.w3c.dom.Element;
importorg.w3c.dom.Node;
importorg.w3c.dom.NodeList;
publicclassXmlExam{
publicstaticvoidmain(Stringargs[]){
Elementelement=null;
//可以使用絕對路勁
Filef=newFile("xml.xml");
//documentBuilder為抽象不能直接實例化(將XML文件轉換為DOM文件)
DocumentBuilderdb=null;
DocumentBuilderFactorydbf=null;
try{
//返回documentBuilderFactory對象
dbf=DocumentBuilderFactory.newInstance();
//返回db對象用documentBuilderFatory對象獲得返回documentBuildr對象
db=dbf.newDocumentBuilder();
//得到一個DOM並返回給document對象
Documentdt=db.parse(f);
//得到一個elment根元素
element=dt.getDocumentElement();
//獲得根節點
System.out.println("根元素:"+element.getNodeName());
//獲得根元素下的子節點
NodeListchildNodes=element.getChildNodes();
//遍歷這些子節點
for(inti=0;i<childNodes.getLength();i++){
//獲得每個對應位置i的結點
Nodenode1=childNodes.item(i);
if("Account".equals(node1.getNodeName())){
//如果節點的名稱為"Account",則輸出Account元素屬性type
System.out.println(" 找到一篇賬號.所屬區域:"
+node1.getAttributes().getNamedItem("type")
.getNodeValue()+".");
//獲得<Accounts>下的節點
NodeListnodeDetail=node1.getChildNodes();
//遍歷<Accounts>下的節點
for(intj=0;j<nodeDetail.getLength();j++){
//獲得<Accounts>元素每一個節點
Nodedetail=nodeDetail.item(j);
if("code".equals(detail.getNodeName()))//輸出code
System.out
.println("卡號:"+detail.getTextContent());
elseif("pass".equals(detail.getNodeName()))//輸出pass
System.out
.println("密碼:"+detail.getTextContent());
elseif("name".equals(detail.getNodeName()))//輸出name
System.out
.println("姓名:"+detail.getTextContent());
elseif("money".equals(detail.getNodeName()))//輸出money
System.out
.println("余額:"+detail.getTextContent());
}
}
}
}catch(Exceptione){
e.printStackTrace();
}
}
}
要導入的jar包
Ⅳ java解析xml文件的用到哪些包
利用以下工具都可以實現對xml 文件的解析 ,dom4j, jdom, SAX,DOM
如果是在java程序中解析xml文件,主要使用dom4j和jdom,dom4j用的比較多,諸多MVC框架及orm框架都是使用dom4j來解析xml文件的。
dom 方式則和語言無關的xml文件操作的國際標准。
Ⅳ Java如何讀取XML文件 具體實現
xml的解析
1.解析式為了得到裡面的內容,進行增,刪,改查的操作
XML的解析方式
SAX(Simple API for XML)xml文檔的一種簡單的解析方式
DOM(Document Object Model)
DOM4J
SAX:基於事件的解析方式
DOM: 基於對象的解析方式
事件監聽三要素
1.事件源
2.監聽器
3.事件
SAX 基於事件的解析
優點: 簡單 效率高
缺點:順序執行,不能得到某個元素 不能逆向執行
不能進行增,與刪的操作
SAX解析方式工作原理:
通過時間源xml文檔創建SAXParseFactory
SAXParserFactory factory=SAXParserFactory.newInstance();
得到一個解析器
SAXParser parse=factory.newSAXParser();
對xml文件進行解析
得到解析的文件對象
File file=new File("employees.xml");
通過監聽器進行解析
MyListener listener=new MyListener();
parse.parse(file,listener);
對於監聽器有5個方法:監聽器所在的類實現的介面有:
org.xml.sax.hepers.DefaultHandler
org.xml.sax
通過查看API文檔中的DefaultHandler類中的下面5個方法
startDocument() 對於文檔開始的解析
public void startDocument()throws SAXException{
System.out.println("文檔開始解析啦!!!!");
}
startElement()元素開始的解析其中幾個名詞
url:命名空間的url
localName:命名空間的前綴
qName:元素
attributes:元素里的屬性
public void startElement(String url,String localName,String qName,Attributes attributes)throws SAXException{
StringBuffer sb=new StringBuffer();
sb.append("<"+qName);
for(int i=0;i<attributes.getLength();i++){
String attName=attributes.getQName(i);獲得元素屬性名稱其中的i為元素的第幾個屬性
String attValue=attributes.getValue(i);獲得元素屬性的值其中的i為元素的第幾個屬性的值
sb.append(attName+"="+attValue);
}
sb.append(">");
System.out.print(sb.toString());
}
character()獲得元素的內容體
public void characters(char[]ch,int start,int length)throws SAXException{
System.out.print(new String(ch,start,length));
}
endElement()獲得元素的結束事件
public void endElement(String url,String localName,String qName)throws SAXException{
System.out.print("</"+qName+">");
}
endDocument()獲得文檔的結束事件
public void endDocument(){
System.out.println("文檔解析結束啦!!!!");
}
對於SAX解析只能逐行解析不能越行解析
DOM:基於對象的
優點:靈活,能進行增刪的操作
缺點:讀取速度慢,效率低 佔用的內容多
對於DOM解析:不需要添加監聽器,按級解析從根元素、一級子元素、二級子元素......
同SAX解析相同剛開始也是要得到一個解析器;
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() ;
因為構造方法不可用不可以new對象只能用newInstance()方法得到解析器對象
DocumentBuilder builder=factory.newDocumentBuilder() ;得到一個解析器
對於document可以有兩種方法得到:
Document document= builder.parse(new File(文件路徑));通過parse方法解析一個已有的xml文檔
Document document=builder.newDocument();可以得到一個空的document對象
得到根節點
Element root=document.getDocumentElement();
如果不存在根節點即為一個空document對象的時候只能添加跟節點
Element root=document.createElement(根節點的名字)
得到根節點下面的所有一級子元素
NodeList list=root.getElementsByTagName(根節點的名字可以用root.getTagName或者root.getNodeName()得到根節點的名字)();
{
對與document可以添加一級子元素
不管document是否為空都可以添加
Element firstElements =root.creatElement(一級子元素的名字);
當然也可以為一級子元素添加屬性
一級子元素的名字.setAttribute("屬性名","屬性值");
}
通過遍歷list集合
for(int i=0;i<list.getLength();i++){
Element first_elements=(Element)list.item(i);
可以得到一級資源的屬性的值當知道屬性的時候
String attribute=first_elements.getAttribute("屬性的名字");
得到一級子元素的名字
String first_elements_name=first_elements.getNodeName();
得到一級子元素下面所有的元素如id 第一個id元素當然也可有很多個id
通過item()來確定要取那個id
Element id_element=(Element)first_elements.getElementByName("id").item(0);
得到id的值
String id_value=id_element.getFirstChild().getTextContent();
通過這個遍歷集合可以拿到所有子元素
}
DOM添加或刪除元素:
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance() ;
因為構造方法不可用不可以new對象只能用newInstance()方法得到解析器對象
DocumentBuilder builder=factory.newDocumentBuilder() ;得到一個解析器
對於document可以有兩種方法得到:
Document document= builder.parse(new File(文件路徑));通過parse方法解析一個已有的xml文檔
Document document=builder.newDocument();可以得到一個空的document對象
得到根節點
Element root=document.getDocumentElement();
如果不存在根節點即為一個空document對象的時候只能添加跟節點
Element root=document.createElement(根節點的名字)
對與document可以添加一級子元素
不管document是否為空都可以添加
Element firstElements =root.creatElement(一級子元素的名字);
當然也可以為一級子元素添加屬性
一級子元素的名字.setAttribute("屬性名","屬性值");
添加二級子元素
Element secondElements=firstElements.creatElement("二級子元素的名字");
掛載組裝
一級子元素firstElements.append(secondElements);
根節點root.appendChild(firstElements);
將document對象樹寫入磁碟
TransformerFactory tf=TransformerFactory.newInstance();
Transformer former=tf.newTransformer();
DOMSource source=new DOMSource(document);
StreamResult result= new StreamResult(new File("10.xml"));結果集
former.transform(source,result);
完畢
DOM4j需要藉助外部jar包
需要藉助外部jar包就必須設置環境變數中的classpath把classpath設置成
dom4j jar包存在的路徑(絕對路徑)
例如:
set classpath=.;C:\Documents and Settings\Administrator\桌面\day3\dom4j.jar
import org.dom4j.io.*;
import java.io.*;
import java.util.*;
import org.dom4j.*;
public static void read_XML(String fileName){
try{
//得到一個解析器,相當於SAX,DOM裡面的解析器工廠,與解析器
SAXReader reader=new SAXReader();
//得到一個對象樹
Document document=reader.read(new File(fileName));
//得到一個根元素
Element root=document.getRootElement();
System.out.println(root.getName());
//得到所有的一級子元素
List firstElements=root.elements();
Iterator it=firstElements.iterator();
while(it.hasNext()){
//依次得到每一個一級子元素
Element firstElement=(Element)it.next();
System.out.println(firstElement.getName());
//得到所有的屬性
List attributes=firstElement.attributes();
for(Object obj:attributes){
//依次得到每一個屬性
Attribute att=(Attribute)obj;
System.out.println(att.getName()+"="+att.getValue());
}
//得到一級子元素下面的所有元素,及其附帶值
List second_Elements=firstElement.elements();
Iterator second_Element=second_Elements.iterator();
while(second_Element.hasNext()){
Element sec_Element=(Element)second_Element.next();
System.out.println(sec_Element.getName()+":"+sec_Element.getText());
}
System.out.println("----------");
}
}catch(Exception e){
}
}
public static void write(String fileName){
try{
Document document = DocumentHelper.createDocument();
//創造一級子元素
Element books=document.addElement("books");
books.addComment("The book is J2EE");
Element book=books.addElement("book");
創建元素的屬性
book.addAttribute("show","yes");
book.addAttribute("page","100");
創建二級子元素
Element book_name=book.addElement("bookName");
創建元素的內容體
book_name.setText("xml");
Element book_price=book.addElement("bookPrice");
book_price.setText("3000");
Element book_press=book.addElement("bookPress");
book_press.setText("etoak");
Element book_author=book.addElement("bookAuthor");
book_author.setText("Robin");
//掛載另一個一級子元素
book=books.addElement("book");
book.addAttribute("show","NO");
book.addAttribute("page","200");
book_name=book.addElement("bookName");
book_name.setText("葵花寶典");
book_price=book.addElement("bookPrice");
book_price.setText("無價之寶");
book_press.addElement("bookPress");
book_press.setText("華山派");
book_author=book.addElement("bookAuthor");
book_author.setText("林平之");
//創建xml文件輸出的路徑
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("gbk");
XMLWriter xw=new XMLWriter(new FileOutputStream(fileName),
format);
//XMLWriter xx= new XMLWriter(System.out,OutputFormat.createPrettyPrint());
xw.write(document);
xw.flush();
xw.close();
}catch(Exception e){
對於DOM4j添加子元素,是一級一級的添加的而在DOM中是先創造
子元素然後再掛載的DOM4j在創建子元素的時候就確定好了順序
對於文件的輸出各有千秋各有特色其中SAX是需要添加監聽器的
}
}
public static void update(String fileName){
try{
SAXReader reader= new SAXReader();
Document document = reader.read(new File(fileName));
Element root = document.getRootElement();
System.out.println(root.getName());
在根節點上添加一級子元素
Element student=root.addElement("student");
Element id=student.addElement("id");
id.setText("007");
OutputStream os= new FileOutputStream(fileName);
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xw = new XMLWriter(os,format);
xw.write(document);
xw.flush();
xw.close();
}catch(Exception e){
和創建一個新的document對象類似只不過這個的根節點已經存在
直接可以在根節點上添加一級子元素;
}
}
Ⅵ JAVA中XML解析問題
你這是屬於使用dom4j.jar,利用SAX的方式讀取xml文件..
可以參照API, 你把property和element搞混了, 這里的sex是element.
1.讀取xml文件, inStream的過程你用任何方式都可以.
2.利用sax的方式
SAXReader reader = new SAXReader();
Document doc = reader.read(inStream);
3.根據節點獲取內容
String name = ((Element)doc.selectSingleNode("/home/name")).getText();
String sex = ((Element)doc.selectSingleNode("/home/sex")).getText();
...
還有,確保你的XML是符合規范的,不符合規范肯定通不過,最好用帶有Validation的XML工具檢查一下
Ⅶ 在java中解析xml文檔的問題
我給你個例子吧。。。
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil
{
//該方法用於從XML配置文件中提取具體類類名,並返回一個實例對象
public static Object getBean()
{
try
{
//創建文檔對象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("config.xml"));
//獲取包含類名的文本節點
NodeList nl = doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
//通過類名生成實例對象並將其返回
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
}
下面是xml文件
<?xml version="1.0"?>
<config>
<className>HaierFactory</className>
</config>
什麼包都不要導,就算在最低級的JCreator中直接編譯就可以的。。。自己寫個main函數調用一下。。
不懂追問,望採納。如果要學習類似只是2有視頻教程
Ⅷ 如有用Java解析 下面的xml流
引入dom4j.jar
SAXreader reader = new SAXReader();
Document doc = reader.read(InputStream is); // 這里將流傳入
Element root = doc.getRootElement(); // root就是<RESPONSE>節點
Element head = root.element("HEAD");
Element body = root.element("BODY");
裡面有很多方法可以獲得子節點,以及獲得屬性等
Ⅸ java 解析xml文件內容
publicclassContext{
privateStringrequest;
privateStringresponse;
publicStringgetRequest(){
returnrequest;
}
publicvoidsetRequest(Stringrequest){
this.request=request;
}
publicStringgetResponse(){
returnresponse;
}
publicvoidsetResponse(Stringresponse){
this.response=response;
}
}
importjava.util.ArrayList;
importjava.util.List;
importorg.dom4j.Document;
importorg.dom4j.DocumentHelper;
importorg.dom4j.Element;
publicclassXmlInfoUtils{
publicstaticvoidparseXML(Stringxml)throwsException{
//將xml轉換為document對象
Documentdocument=DocumentHelper.parseText(xml);
//獲取根目錄節點infos;
Elementroot=document.getRootElement();
//獲取根節點下的所有直接子節點info
List<Element>infoNodes=root.elements();
//遍歷所有info節點
for(Elementelement:infoNodes){
//獲取info節點下的所有直接子節點request和response
List<Element>contextNodes=element.elements();
//遍歷節點
for(Elementcontext:contextNodes){
//獲取值
System.out.println(context.getName()+""+context.getText());
}
}
}
/**
*生成所需要的XML
*/
publicstaticStringcreateXML(List<Context>list)throwsException{
Documentdocument=DocumentHelper.createDocument();
Elementroot=document.addElement("infos");
for(Contextcontext:list){
Elemente=root.addElement("info");
e.addElement("request").setText(context.getRequest());
e.addElement("response").setText(context.getResponse());
}
returndocument.asXML();
}
/**測試代碼*/
publicstaticvoidmain(String[]args)throwsException{
//准備數據
List<Context>list=newArrayList<Context>();
Contextcontext=newContext();
context.setRequest("sss");
context.setResponse("{aa:bb}");
list.add(context);
context=newContext();
context.setRequest("qqq");
context.setResponse("{aa:bb}");
list.add(context);
//創建XML
Stringxml=createXML(list);
//解析XML
parseXML(xml);
}
}
Ⅹ java解析xml文件需要導入哪些的包
推薦dom4j.jar
jdom.jar也可以考慮,其他的沒有這兩個好用。